[FFmpeg-cvslog] r16603 - in trunk: libavformat/mpegtsenc.c tests/libav.regression.ref
bcoudurier
subversion
Wed Jan 14 22:57:10 CET 2009
Author: bcoudurier
Date: Wed Jan 14 22:57:10 2009
New Revision: 16603
Log:
set pts and dts of pes packets exactly according to specs
Modified:
trunk/libavformat/mpegtsenc.c
trunk/tests/libav.regression.ref
Modified: trunk/libavformat/mpegtsenc.c
==============================================================================
--- trunk/libavformat/mpegtsenc.c Wed Jan 14 22:41:05 2009 (r16602)
+++ trunk/libavformat/mpegtsenc.c Wed Jan 14 22:57:10 2009 (r16603)
@@ -21,6 +21,7 @@
#include "libavutil/bswap.h"
#include "libavutil/crc.h"
+#include "libavcodec/mpegvideo.h"
#include "avformat.h"
#include "mpegts.h"
@@ -670,6 +671,7 @@ static int mpegts_write_packet(AVFormatC
uint8_t *buf= pkt->data;
MpegTSWriteStream *ts_st = st->priv_data;
int len, max_payload_size;
+ const uint8_t *access_unit_index = NULL;
if (st->codec->codec_type == CODEC_TYPE_SUBTITLE) {
/* for subtitle, a single PES packet must be generated */
@@ -683,6 +685,27 @@ static int mpegts_write_packet(AVFormatC
return 0;
}
max_payload_size = DEFAULT_PES_PAYLOAD_SIZE;
+ if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO ||
+ st->codec->codec_id == CODEC_ID_MPEG1VIDEO) {
+ const uint8_t *p = pkt->data;
+ const uint8_t *end = pkt->data+pkt->size;
+ uint32_t state = -1;
+ while (p < end) {
+ p = ff_find_start_code(p, end, &state);
+ if (state == PICTURE_START_CODE) {
+ access_unit_index = p - 4;
+ break;
+ }
+ }
+ } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
+ access_unit_index = pkt->data;
+ }
+
+ if (!access_unit_index) {
+ av_log(s, AV_LOG_ERROR, "error, could not find access unit start\n");
+ return -1;
+ }
+
while (size > 0) {
len = max_payload_size - ts_st->payload_index;
if (len > size)
@@ -691,16 +714,19 @@ static int mpegts_write_packet(AVFormatC
buf += len;
size -= len;
ts_st->payload_index += len;
- if (ts_st->payload_pts == AV_NOPTS_VALUE)
- ts_st->payload_pts = pkt->pts;
- if (ts_st->payload_dts == AV_NOPTS_VALUE)
+ if (access_unit_index && access_unit_index < buf &&
+ ts_st->payload_pts == AV_NOPTS_VALUE &&
+ ts_st->payload_dts == AV_NOPTS_VALUE) {
ts_st->payload_dts = pkt->dts;
+ ts_st->payload_pts = pkt->pts;
+ }
if (ts_st->payload_index >= max_payload_size) {
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
ts_st->payload_pts, ts_st->payload_dts);
ts_st->payload_pts = AV_NOPTS_VALUE;
ts_st->payload_dts = AV_NOPTS_VALUE;
ts_st->payload_index = 0;
+ access_unit_index = NULL; // unset access unit to avoid setting pts/dts again
}
}
return 0;
Modified: trunk/tests/libav.regression.ref
==============================================================================
--- trunk/tests/libav.regression.ref Wed Jan 14 22:41:05 2009 (r16602)
+++ trunk/tests/libav.regression.ref Wed Jan 14 22:57:10 2009 (r16603)
@@ -9,7 +9,7 @@ c351132527ccb1e8cab06cc0822fde23 *./test
bdb7484c68db722f66ba1630cf79844c *./tests/data/b-libav.mpg
378880 ./tests/data/b-libav.mpg
./tests/data/b-libav.mpg CRC=0x2b71a386
-447b005e527cf495ec13092e788f028d *./tests/data/b-libav.ts
+d1ab4041e32fb802bb164844d91cc5fe *./tests/data/b-libav.ts
471692 ./tests/data/b-libav.ts
./tests/data/b-libav.ts CRC=0xcc4948e1
1b28a16652bb8ac528b33f7478ca18b6 *./tests/data/b-libav.swf
More information about the ffmpeg-cvslog
mailing list