[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