From f5f0eb0f265bb22fab28d7c93ce1acb0a0880ba2 Mon Sep 17 00:00:00 2001 From: martii Date: Thu, 15 Aug 2013 17:05:55 +0200 Subject: [PATCH] libeplayer3/wmv: revert to (almost) original version --- libeplayer3/output/writer/wmv.c | 37 ++++++++++++++------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/libeplayer3/output/writer/wmv.c b/libeplayer3/output/writer/wmv.c index 0a4b7a8..dd0809a 100644 --- a/libeplayer3/output/writer/wmv.c +++ b/libeplayer3/output/writer/wmv.c @@ -154,10 +154,11 @@ static int writeData(void* _call) private_data.height = call->Height; private_data.framerate = call->FrameRate; +#define PES_MIN_HEADER_SIZE 9 if (initialHeader) { - unsigned char PesHeader[PES_MAX_HEADER_SIZE]; - unsigned char PesPayload[128]; - unsigned char* PesPtr = PesPayload; + unsigned char PesPacket[PES_MIN_HEADER_SIZE+128]; + unsigned char* PesPtr; + unsigned int MetadataLength; unsigned int crazyFramerate = 0; wmv_printf(10, "Framerate: %u\n", private_data.framerate); @@ -167,7 +168,7 @@ static int writeData(void* _call) crazyFramerate = ((10000000.0 / private_data.framerate) * 1000.0); wmv_printf(10, "crazyFramerate: %u\n", crazyFramerate); - memset (PesPayload, 0, sizeof(PesPayload)); + PesPtr = &PesPacket[PES_MIN_HEADER_SIZE]; memcpy (PesPtr, Metadata, sizeof(Metadata)); PesPtr += METADATA_STRUCT_C_START; @@ -192,13 +193,11 @@ static int writeData(void* _call) *PesPtr++ = (crazyFramerate >> 16) & 0xff; *PesPtr++ = crazyFramerate >> 24; - struct iovec iov[2]; - iov[0].iov_base = PesHeader; - iov[1].iov_base = PesPayload; - iov[1].iov_len = PesPtr - PesPayload; - iov[0].iov_len = InsertPesHeader (PesHeader, iov[1].iov_len, VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0); + MetadataLength = PesPtr - &PesPacket[PES_MIN_HEADER_SIZE]; - len = writev(call->fd, iov, 2); + int HeaderLength = InsertPesHeader (PesPacket, MetadataLength, VC1_VIDEO_PES_START_CODE, INVALID_PTS_VALUE, 0); + + len = write(call->fd,PesPacket, HeaderLength + MetadataLength); initialHeader = 0; } @@ -216,7 +215,9 @@ static int writeData(void* _call) wmv_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n", PacketLength, Remaining, Position); unsigned char PesHeader[PES_MAX_HEADER_SIZE]; + memset (PesHeader, '0', PES_MAX_HEADER_SIZE); int HeaderLength = InsertPesHeader (PesHeader, PacketLength, VC1_VIDEO_PES_START_CODE, call->Pts, 0); + unsigned char* PacketStart; if(insertSampleHeader) { unsigned int PesLength; @@ -236,18 +237,12 @@ static int writeData(void* _call) insertSampleHeader = 0; } - struct iovec iov[2]; - iov[0].iov_base = PesHeader; - iov[0].iov_len = HeaderLength; - iov[1].iov_base = call->data + Position; - iov[1].iov_len = PacketLength; + PacketStart = malloc(call->len + HeaderLength); + memcpy (PacketStart, PesHeader, HeaderLength); + memcpy (PacketStart + HeaderLength, call->data + Position, PacketLength); - ssize_t l = writev(call->fd, iov, 2); - if (l < 0) { - len = l; - break; - } - len += l; + len = write(call->fd, PacketStart, PacketLength + HeaderLength); + free(PacketStart); Position += PacketLength; call->Pts = INVALID_PTS_VALUE;