libeplayer3: let writers use AVPacket

This commit is contained in:
martii
2014-04-05 16:17:57 +02:00
parent ec307c0f09
commit 1c380d1167
15 changed files with 77 additions and 110 deletions

View File

@@ -334,14 +334,14 @@ static void *FFMPEGThread(void *arg)
break; // while break; // while
} }
long long int pts; long long int pts;
uint8_t *packet_data = packet.data;
int packet_size = packet.size;
Track_t *videoTrack = NULL; Track_t *videoTrack = NULL;
Track_t *audioTrack = NULL; Track_t *audioTrack = NULL;
Track_t *subtitleTrack = NULL; Track_t *subtitleTrack = NULL;
Track_t *teletextTrack = NULL; Track_t *teletextTrack = NULL;
context->playback->readCount += packet_size; context->playback->readCount += packet.size;
avOut.packet = &packet;
int pid = avContext->streams[packet.stream_index]->id; int pid = avContext->streams[packet.stream_index]->id;
@@ -357,17 +357,14 @@ static void *FFMPEGThread(void *arg)
if (context->manager->teletext->Command(context, MANAGER_GET_TRACK, &teletextTrack) < 0) if (context->manager->teletext->Command(context, MANAGER_GET_TRACK, &teletextTrack) < 0)
ffmpeg_err("error getting teletext track\n"); ffmpeg_err("error getting teletext track\n");
ffmpeg_printf(200, "packet_size %d - index %d\n", packet_size, pid); ffmpeg_printf(200, "packet_size %d - index %d\n", packet.size, pid);
if (videoTrack && (videoTrack->Id == pid)) { if (videoTrack && (videoTrack->Id == pid)) {
currentVideoPts = /* CHECK videoTrack->pts = */pts = calcPts(avContext, videoTrack->stream, packet.pts); currentVideoPts = /* CHECK videoTrack->pts = */pts = calcPts(avContext, videoTrack->stream, packet.pts);
ffmpeg_printf(200, "VideoTrack index = %d %lld\n", pid, currentVideoPts); ffmpeg_printf(200, "VideoTrack index = %d %lld\n", pid, currentVideoPts);
avOut.data = packet_data;
avOut.len = packet_size;
avOut.pts = pts; avOut.pts = pts;
avOut.packet = &packet;
avOut.type = "video"; avOut.type = "video";
avOut.stream = videoTrack->stream; avOut.stream = videoTrack->stream;
@@ -382,10 +379,7 @@ static void *FFMPEGThread(void *arg)
currentAudioPts = /* CHECK audioTrack->pts = */pts = calcPts(avContext, audioTrack->stream, packet.pts); currentAudioPts = /* CHECK audioTrack->pts = */pts = calcPts(avContext, audioTrack->stream, packet.pts);
ffmpeg_printf(200, "AudioTrack index = %d\n", pid); ffmpeg_printf(200, "AudioTrack index = %d\n", pid);
avOut.data = packet_data;
avOut.len = packet_size;
avOut.pts = pts; avOut.pts = pts;
avOut.packet = &packet;
avOut.type = "audio"; avOut.type = "audio";
avOut.stream = audioTrack->stream; avOut.stream = audioTrack->stream;
avOut.avfc = avContext; avOut.avfc = avContext;
@@ -428,7 +422,7 @@ static void *FFMPEGThread(void *arg)
} }
} /* duration */ } /* duration */
} else if (teletextTrack && (teletextTrack->Id == pid)) { } else if (teletextTrack && (teletextTrack->Id == pid)) {
teletext_write(pid, packet_data, packet_size); teletext_write(pid, packet.data, packet.size);
} }
av_free_packet(&packet); av_free_packet(&packet);

View File

@@ -37,9 +37,6 @@ typedef enum {
} OutputCmd_t; } OutputCmd_t;
typedef struct { typedef struct {
uint8_t *data;
unsigned int len;
int uNoOfChannels; int uNoOfChannels;
int uSampleRate; int uSampleRate;
int uBitsPerSample; int uBitsPerSample;

View File

@@ -19,8 +19,6 @@ typedef struct Context_s Context_t;
typedef struct { typedef struct {
int fd; int fd;
uint8_t *data;
unsigned int len;
int64_t Pts; int64_t Pts;
int uNoOfChannels; int uNoOfChannels;
int uSampleRate; int uSampleRate;

View File

@@ -913,7 +913,7 @@ static int Write(Context_t *context, AudioVideoOut_t *out)
video = !strcmp("video", out->type); video = !strcmp("video", out->type);
audio = !strcmp("audio", out->type); audio = !strcmp("audio", out->type);
linuxdvb_printf(20, "DataLength=%u Pts=%llu\n", out->len, out->pts); linuxdvb_printf(20, "DataLength=%u Pts=%llu\n", out->packet->size, out->pts);
linuxdvb_printf(20, "v%d a%d\n", video, audio); linuxdvb_printf(20, "v%d a%d\n", video, audio);
if (video) { if (video) {
@@ -937,8 +937,6 @@ static int Write(Context_t *context, AudioVideoOut_t *out)
ret = cERR_LINUXDVB_ERROR; ret = cERR_LINUXDVB_ERROR;
} else { } else {
call.fd = videofd; call.fd = videofd;
call.data = out->data;
call.len = out->len;
call.Pts = out->pts; call.Pts = out->pts;
call.packet = out->packet; call.packet = out->packet;
@@ -975,8 +973,6 @@ static int Write(Context_t *context, AudioVideoOut_t *out)
ret = cERR_LINUXDVB_ERROR; ret = cERR_LINUXDVB_ERROR;
} else { } else {
call.fd = audiofd; call.fd = audiofd;
call.data = out->data;
call.len = out->len;
call.Pts = out->pts; call.Pts = out->pts;
call.packet = out->packet; call.packet = out->packet;

View File

@@ -104,7 +104,7 @@ static int writeData(WriterAVCallData_t *call)
ac3_printf(10, "AudioPts %lld\n", call->Pts); ac3_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
ac3_err("parsing NULL Data. ignoring...\n"); ac3_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -118,10 +118,10 @@ static int writeData(WriterAVCallData_t *call)
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = iov[0].iov_len =
InsertPesHeader(PesHeader, call->len, InsertPesHeader(PesHeader, call->packet->size,
PRIVATE_STREAM_1_PES_START_CODE, call->Pts, 0); PRIVATE_STREAM_1_PES_START_CODE, call->Pts, 0);
iov[1].iov_base = call->data; iov[1].iov_base = call->packet->data;
iov[1].iov_len = call->len; iov[1].iov_len = call->packet->size;
return writev(call->fd, iov, 2); return writev(call->fd, iov, 2);
} }

View File

@@ -109,7 +109,7 @@ static int writeData(WriterAVCallData_t *call)
return 0; return 0;
} }
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
divx_err("parsing NULL Data. ignoring...\n"); divx_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -147,7 +147,7 @@ static int writeData(WriterAVCallData_t *call)
int ic = 0; int ic = 0;
iov[ic].iov_base = PesHeader; iov[ic].iov_base = PesHeader;
iov[ic++].iov_len = iov[ic++].iov_len =
InsertPesHeader(PesHeader, call->len, MPEG_VIDEO_PES_START_CODE, InsertPesHeader(PesHeader, call->packet->size, MPEG_VIDEO_PES_START_CODE,
call->Pts, FakeStartCode); call->Pts, FakeStartCode);
iov[ic].iov_base = FakeHeaders; iov[ic].iov_base = FakeHeaders;
iov[ic++].iov_len = FakeHeaderLength; iov[ic++].iov_len = FakeHeaderLength;
@@ -158,8 +158,8 @@ static int writeData(WriterAVCallData_t *call)
initialHeader = 0; initialHeader = 0;
} }
iov[ic].iov_base = call->data; iov[ic].iov_base = call->packet->data;
iov[ic++].iov_len = call->len; iov[ic++].iov_len = call->packet->size;
int len = writev(call->fd, iov, ic); int len = writev(call->fd, iov, ic);

View File

@@ -106,7 +106,7 @@ static int writeData(WriterAVCallData_t *call)
dts_printf(10, "AudioPts %lld\n", call->Pts); dts_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
dts_err("parsing NULL Data. ignoring...\n"); dts_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -117,11 +117,11 @@ static int writeData(WriterAVCallData_t *call)
} }
// #define DO_BYTESWAP // #define DO_BYTESWAP
#ifdef DO_BYTESWAP #ifdef DO_BYTESWAP
unsigned char *Data = (unsigned char *) malloc(call->len); unsigned char *Data = (unsigned char *) malloc(call->packet->size);
memcpy(Data, call->data, call->len); memcpy(Data, call->packet->data, call->packet->size);
/* 16-bit byte swap all data before injecting it */ /* 16-bit byte swap all data before injecting it */
for (i = 0; i < call->len; i += 2) { for (i = 0; i < call->packet->size; i += 2) {
unsigned char Tmp = Data[i]; unsigned char Tmp = Data[i];
Data[i] = Data[i + 1]; Data[i] = Data[i + 1];
Data[i + 1] = Tmp; Data[i + 1] = Tmp;
@@ -132,16 +132,16 @@ static int writeData(WriterAVCallData_t *call)
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = iov[0].iov_len =
InsertPesHeader(PesHeader, call->len, InsertPesHeader(PesHeader, call->packet->size,
MPEG_AUDIO_PES_START_CODE MPEG_AUDIO_PES_START_CODE
/*PRIVATE_STREAM_1_PES_START_CODE */ , call->Pts, /*PRIVATE_STREAM_1_PES_START_CODE */ , call->Pts,
0); 0);
#ifdef DO_BYTESPWAP #ifdef DO_BYTESPWAP
iov[1].iov_base = Data; iov[1].iov_base = Data;
#else #else
iov[1].iov_base = call->data; iov[1].iov_base = call->packet->data;
#endif #endif
iov[1].iov_len = call->len; iov[1].iov_len = call->packet->size;
int len = writev(call->fd, iov, 2); int len = writev(call->fd, iov, 2);

View File

@@ -102,7 +102,7 @@ static int writeData(WriterAVCallData_t *call)
flac_printf(10, "AudioPts %lld\n", call->Pts); flac_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
flac_err("parsing NULL Data. ignoring...\n"); flac_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -115,10 +115,10 @@ static int writeData(WriterAVCallData_t *call)
struct iovec iov[2]; struct iovec iov[2];
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = iov[0].iov_len =
InsertPesHeader(PesHeader, call->len, MPEG_AUDIO_PES_START_CODE, InsertPesHeader(PesHeader, call->packet->size, MPEG_AUDIO_PES_START_CODE,
call->Pts, 0); call->Pts, 0);
iov[1].iov_base = call->data; iov[1].iov_base = call->packet->data;
iov[1].iov_len = call->len; iov[1].iov_len = call->packet->size;
int len = writev(call->fd, iov, 2); int len = writev(call->fd, iov, 2);

View File

@@ -103,7 +103,7 @@ static int writeData(WriterAVCallData_t *call)
h263_printf(10, "VideoPts %lld\n", call->Pts); h263_printf(10, "VideoPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
h263_err("NULL Data. ignoring...\n"); h263_err("NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -114,11 +114,11 @@ static int writeData(WriterAVCallData_t *call)
} }
int HeaderLength = int HeaderLength =
InsertPesHeader(PesHeader, call->len, H263_VIDEO_PES_START_CODE, InsertPesHeader(PesHeader, call->packet->size, H263_VIDEO_PES_START_CODE,
call->Pts, 0); call->Pts, 0);
int PrivateHeaderLength = int PrivateHeaderLength =
InsertVideoPrivateDataHeader(&PesHeader[HeaderLength], call->len); InsertVideoPrivateDataHeader(&PesHeader[HeaderLength], call->packet->size);
int PesLength = int PesLength =
PesHeader[PES_LENGTH_BYTE_0] + PesHeader[PES_LENGTH_BYTE_0] +
@@ -134,8 +134,8 @@ static int writeData(WriterAVCallData_t *call)
struct iovec iov[2]; struct iovec iov[2];
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = HeaderLength; iov[0].iov_len = HeaderLength;
iov[1].iov_base = call->data; iov[1].iov_base = call->packet->data;
iov[1].iov_len = call->len; iov[1].iov_len = call->packet->size;
len = writev(call->fd, iov, 2); len = writev(call->fd, iov, 2);
h263_printf(10, "< len %d\n", len); h263_printf(10, "< len %d\n", len);

View File

@@ -132,7 +132,7 @@ static int writeData(WriterAVCallData_t *call)
h264_printf(10, "VideoPts %lld - %d %d\n", call->Pts, TimeDelta, h264_printf(10, "VideoPts %lld - %d %d\n", call->Pts, TimeDelta,
TimeScale); TimeScale);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
h264_err("NULL Data. ignoring...\n"); h264_err("NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -142,12 +142,12 @@ static int writeData(WriterAVCallData_t *call)
return 0; return 0;
} }
if ((call->len > 3) if ((call->packet->size > 3)
&& &&
((call->data[0] == 0x00 && call->data[1] == 0x00 ((call->packet->data[0] == 0x00 && call->packet->data[1] == 0x00
&& call->data[2] == 0x00 && call->data[3] == 0x01) && call->packet->data[2] == 0x00 && call->packet->data[3] == 0x01)
|| (call->data[0] == 0xff && call->data[1] == 0xff || (call->packet->data[0] == 0xff && call->packet->data[1] == 0xff
&& call->data[2] == 0xff && call->data[3] == 0xff))) { && call->packet->data[2] == 0xff && call->packet->data[3] == 0xff))) {
unsigned int PacketLength = 0; unsigned int PacketLength = 0;
unsigned int FakeStartCode = /* (call->Version << 8) | */ PES_VERSION_FAKE_START_CODE; unsigned int FakeStartCode = /* (call->Version << 8) | */ PES_VERSION_FAKE_START_CODE;
iov[ic++].iov_base = PesHeader; iov[ic++].iov_base = PesHeader;
@@ -157,9 +157,9 @@ static int writeData(WriterAVCallData_t *call)
iov[ic++].iov_len = call->stream->codec->extradata_size; iov[ic++].iov_len = call->stream->codec->extradata_size;
PacketLength += call->stream->codec->extradata_size; PacketLength += call->stream->codec->extradata_size;
} }
iov[ic].iov_base = call->data; iov[ic].iov_base = call->packet->data;
iov[ic++].iov_len = call->len; iov[ic++].iov_len = call->packet->size;
PacketLength += call->len; PacketLength += call->packet->size;
/*Hellmaster1024: some packets will only be accepted by the player if we send one byte more than /*Hellmaster1024: some packets will only be accepted by the player if we send one byte more than
data is available. The content of this byte does not matter. It will be ignored data is available. The content of this byte does not matter. It will be ignored
by the player */ by the player */
@@ -305,7 +305,7 @@ static int writeData(WriterAVCallData_t *call)
initialHeader = 0; initialHeader = 0;
} }
unsigned int SampleSize = call->len; unsigned int SampleSize = call->packet->size;
unsigned int NalStart = 0; unsigned int NalStart = 0;
unsigned int VideoPosition = 0; unsigned int VideoPosition = 0;
@@ -314,7 +314,7 @@ static int writeData(WriterAVCallData_t *call)
unsigned char NalData[4]; unsigned char NalData[4];
int NalPresent = 1; int NalPresent = 1;
memcpy(NalData, call->data + VideoPosition, NalLengthBytes); memcpy(NalData, call->packet->data + VideoPosition, NalLengthBytes);
VideoPosition += NalLengthBytes; VideoPosition += NalLengthBytes;
NalStart += NalLengthBytes; NalStart += NalLengthBytes;
switch (NalLengthBytes) { switch (NalLengthBytes) {
@@ -356,7 +356,7 @@ static int writeData(WriterAVCallData_t *call)
iov[ic++].iov_len = sizeof(Head); iov[ic++].iov_len = sizeof(Head);
} }
iov[ic].iov_base = call->data + VideoPosition; iov[ic].iov_base = call->packet->data + VideoPosition;
iov[ic++].iov_len = NalLength; iov[ic++].iov_len = NalLength;
VideoPosition += NalLength; VideoPosition += NalLength;
@@ -394,7 +394,7 @@ static int writeReverseData(WriterAVCallData_t *call)
h264_printf(10, "VideoPts %lld\n", call->Pts); h264_printf(10, "VideoPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
h264_err("NULL Data. ignoring...\n"); h264_err("NULL Data. ignoring...\n");
return 0; return 0;
} }

View File

@@ -102,7 +102,7 @@ static int writeData(WriterAVCallData_t *call)
mp3_printf(10, "AudioPts %lld\n", call->Pts); mp3_printf(10, "AudioPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
mp3_err("parsing NULL Data. ignoring...\n"); mp3_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -115,10 +115,10 @@ static int writeData(WriterAVCallData_t *call)
struct iovec iov[2]; struct iovec iov[2];
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = iov[0].iov_len =
InsertPesHeader(PesHeader, call->len, MPEG_AUDIO_PES_START_CODE, InsertPesHeader(PesHeader, call->packet->size, MPEG_AUDIO_PES_START_CODE,
call->Pts, 0); call->Pts, 0);
iov[1].iov_base = call->data; iov[1].iov_base = call->packet->data;
iov[1].iov_len = call->len; iov[1].iov_len = call->packet->size;
int len = writev(call->fd, iov, 2); int len = writev(call->fd, iov, 2);

View File

@@ -105,7 +105,7 @@ static int writeData(WriterAVCallData_t *call)
mpeg2_printf(10, "VideoPts %lld\n", call->Pts); mpeg2_printf(10, "VideoPts %lld\n", call->Pts);
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
mpeg2_err("parsing NULL Data. ignoring...\n"); mpeg2_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -115,11 +115,11 @@ static int writeData(WriterAVCallData_t *call)
return 0; return 0;
} }
while (Position < call->len) { while (Position < call->packet->size) {
int PacketLength = (call->len - Position) <= MAX_PES_PACKET_SIZE ? int PacketLength = (call->packet->size - Position) <= MAX_PES_PACKET_SIZE ?
(call->len - Position) : MAX_PES_PACKET_SIZE; (call->packet->size - Position) : MAX_PES_PACKET_SIZE;
int Remaining = call->len - Position - PacketLength; int Remaining = call->packet->size - Position - PacketLength;
mpeg2_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n", mpeg2_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n",
PacketLength, Remaining, Position); PacketLength, Remaining, Position);
@@ -128,7 +128,7 @@ static int writeData(WriterAVCallData_t *call)
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = iov[0].iov_len =
InsertPesHeader(PesHeader, PacketLength, 0xe0, call->Pts, 0); InsertPesHeader(PesHeader, PacketLength, 0xe0, call->Pts, 0);
iov[1].iov_base = call->data + Position; iov[1].iov_base = call->packet->data + Position;
iov[1].iov_len = PacketLength; iov[1].iov_len = PacketLength;
ssize_t l = writev(call->fd, iov, 2); ssize_t l = writev(call->fd, iov, 2);

View File

@@ -196,7 +196,7 @@ static int writeData(WriterAVCallData_t *call)
pcm_printf(10, "AudioPts %lld\n", call->Pts); pcm_printf(10, "AudioPts %lld\n", call->Pts);
if (!call->data || (call->len <= 0)) { if (!call->packet->data || (call->packet->size <= 0)) {
pcm_err("parsing NULL Data. ignoring...\n"); pcm_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -214,8 +214,8 @@ static int writeData(WriterAVCallData_t *call)
call->bLittleEndian); call->bLittleEndian);
} }
unsigned char *buffer = call->data; unsigned char *buffer = call->packet->data;
unsigned int size = call->len; unsigned int size = call->packet->size;
unsigned int n; unsigned int n;
unsigned char *injectBuffer = (unsigned char *) malloc(SubFrameLen); unsigned char *injectBuffer = (unsigned char *) malloc(SubFrameLen);
@@ -427,8 +427,10 @@ static int writeDataIpcm(WriterAVCallData_t *call)
pcmOut.uBitsPerSample = 16; pcmOut.uBitsPerSample = 16;
pcmOut.bLittleEndian = 1; pcmOut.bLittleEndian = 1;
pcmOut.data = output; AVPacket packet;
pcmOut.len = out_samples * sizeof(short) * out_channels; packet.data = output;
packet.size = out_samples * sizeof(short) * out_channels;
pcmOut.packet = &packet;
pcmOut.Pts = pts; // FIXME videoTrack ? pts : 0; pcmOut.Pts = pts; // FIXME videoTrack ? pts : 0;
pcmOut.stream = call->stream; pcmOut.stream = call->stream;

View File

@@ -132,7 +132,7 @@ static int writeData(WriterAVCallData_t *call)
return 0; return 0;
} }
if ((call->data == NULL) || (call->len <= 0)) { if ((call->packet->data == NULL) || (call->packet->size <= 0)) {
vc1_err("parsing NULL Data. ignoring...\n"); vc1_err("parsing NULL Data. ignoring...\n");
return 0; return 0;
} }
@@ -214,18 +214,18 @@ static int writeData(WriterAVCallData_t *call)
initialHeader = 0; initialHeader = 0;
} }
if (call->len > 0 && call->data) { if (call->packet->size > 0 && call->packet->data) {
unsigned int Position = 0; int Position = 0;
unsigned char insertSampleHeader = 1; unsigned char insertSampleHeader = 1;
while (Position < call->len) { while (Position < call->packet->size) {
int PacketLength = int PacketLength =
(call->len - Position) <= (call->packet->size - Position) <=
MAX_PES_PACKET_SIZE ? (call->len - MAX_PES_PACKET_SIZE ? (call->packet->size -
Position) : MAX_PES_PACKET_SIZE; Position) : MAX_PES_PACKET_SIZE;
int Remaining = call->len - Position - PacketLength; int Remaining = call->packet->size - Position - PacketLength;
vc1_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n", vc1_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n",
PacketLength, Remaining, Position); PacketLength, Remaining, Position);
@@ -242,12 +242,12 @@ static int writeData(WriterAVCallData_t *call)
/* /*
vc1_printf(10, "Data Start: {00 00 01 0d} - "); vc1_printf(10, "Data Start: {00 00 01 0d} - ");
int i; int i;
for (i = 0; i < 4; i++) vc1_printf(10, "%02x ", call->data[i]); for (i = 0; i < 4; i++) vc1_printf(10, "%02x ", call->packet->data[i]);
vc1_printf(10, "\n"); vc1_printf(10, "\n");
*/ */
if (!FrameHeaderSeen && (call->len > 3) if (!FrameHeaderSeen && (call->packet->size > 3)
&& (memcmp(call->data, Vc1FrameStartCode, 4) == 0)) && (memcmp(call->packet->data, Vc1FrameStartCode, 4) == 0))
FrameHeaderSeen = 1; FrameHeaderSeen = 1;
if (!FrameHeaderSeen) { if (!FrameHeaderSeen) {
memcpy(&PesHeader[HeaderLength], Vc1FrameStartCode, memcpy(&PesHeader[HeaderLength], Vc1FrameStartCode,
@@ -260,7 +260,7 @@ static int writeData(WriterAVCallData_t *call)
struct iovec iov[2]; struct iovec iov[2];
iov[0].iov_base = PesHeader; iov[0].iov_base = PesHeader;
iov[0].iov_len = HeaderLength; iov[0].iov_len = HeaderLength;
iov[1].iov_base = call->data + Position; iov[1].iov_base = call->packet->data + Position;
iov[1].iov_len = PacketLength; iov[1].iov_len = PacketLength;
ssize_t l = writev(call->fd, iov, 2); ssize_t l = writev(call->fd, iov, 2);

View File

@@ -125,16 +125,6 @@ static int writeData(WriterAVCallData_t *call)
wmv_printf(10, "\n"); wmv_printf(10, "\n");
if (call == NULL) {
wmv_err("call data is NULL...\n");
return 0;
}
if ((call->data == NULL) || (call->len <= 0)) {
wmv_err("parsing NULL Data. ignoring...\n");
return 0;
}
if (call->fd < 0) { if (call->fd < 0) {
wmv_err("file pointer < 0. ignoring ...\n"); wmv_err("file pointer < 0. ignoring ...\n");
return 0; return 0;
@@ -200,20 +190,12 @@ static int writeData(WriterAVCallData_t *call)
initialHeader = 0; initialHeader = 0;
} }
if (call->len > 0 && call->data) { if (call->packet->size > 0 && call->packet->data) {
unsigned int Position = 0; unsigned int Position = 0;
unsigned char insertSampleHeader = 1; unsigned char insertSampleHeader = 1;
while (Position < call->len) { while (Position < call->packet->size) {
int PacketLength = int PacketLength = (call->packet->size - Position) <= MAX_PES_PACKET_SIZE ? (call->packet->size - Position) : MAX_PES_PACKET_SIZE;
(call->len - Position) <=
MAX_PES_PACKET_SIZE ? (call->len -
Position) : MAX_PES_PACKET_SIZE;
int Remaining = call->len - Position - PacketLength;
wmv_printf(20, "PacketLength=%d, Remaining=%d, Position=%d\n",
PacketLength, Remaining, Position);
unsigned char PesHeader[PES_MAX_HEADER_SIZE]; unsigned char PesHeader[PES_MAX_HEADER_SIZE];
memset(PesHeader, '0', PES_MAX_HEADER_SIZE); memset(PesHeader, '0', PES_MAX_HEADER_SIZE);
@@ -226,9 +208,7 @@ static int writeData(WriterAVCallData_t *call)
unsigned int PesLength; unsigned int PesLength;
unsigned int PrivateHeaderLength; unsigned int PrivateHeaderLength;
PrivateHeaderLength = PrivateHeaderLength = InsertVideoPrivateDataHeader(&PesHeader[HeaderLength], call->packet->size);
InsertVideoPrivateDataHeader(&PesHeader[HeaderLength],
call->len);
/* Update PesLength */ /* Update PesLength */
PesLength = PesHeader[PES_LENGTH_BYTE_0] + PesLength = PesHeader[PES_LENGTH_BYTE_0] +
(PesHeader[PES_LENGTH_BYTE_1] << 8) + (PesHeader[PES_LENGTH_BYTE_1] << 8) +
@@ -243,9 +223,9 @@ static int writeData(WriterAVCallData_t *call)
insertSampleHeader = 0; insertSampleHeader = 0;
} }
PacketStart = (unsigned char *) malloc(call->len + HeaderLength); PacketStart = (unsigned char *) malloc(call->packet->size + HeaderLength);
memcpy(PacketStart, PesHeader, HeaderLength); memcpy(PacketStart, PesHeader, HeaderLength);
memcpy(PacketStart + HeaderLength, call->data + Position, memcpy(PacketStart + HeaderLength, call->packet->data + Position,
PacketLength); PacketLength);
len = len =