mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
libeplayer3: let writers use AVPacket
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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 =
|
||||||
|
Reference in New Issue
Block a user