Browse code

avformat/mpegtsenc: Do not create invalid files from annex b streams without SPS/PPS

use global headers to create SPS/PPS when they are available

Fixes Ticket4248

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2015/02/13 06:31:47
Showing 1 changed files
... ...
@@ -1270,26 +1270,35 @@ static int mpegts_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
1270 1270
     if (st->codec->codec_id == AV_CODEC_ID_H264) {
1271 1271
         const uint8_t *p = buf, *buf_end = p + size;
1272 1272
         uint32_t state = -1;
1273
+        int extradd = (pkt->flags & AV_PKT_FLAG_KEY) ? st->codec->extradata_size : 0;
1273 1274
         int ret = ff_check_h264_startcode(s, st, pkt);
1274 1275
         if (ret < 0)
1275 1276
             return ret;
1276 1277
 
1278
+        if (extradd && AV_RB24(st->codec->extradata) > 1)
1279
+            extradd = 0;
1280
+
1277 1281
         do {
1278 1282
             p = avpriv_find_start_code(p, buf_end, &state);
1279 1283
             av_dlog(s, "nal %d\n", state & 0x1f);
1284
+            if ((state & 0x1f) == 7)
1285
+                extradd = 0;
1280 1286
         } while (p < buf_end && (state & 0x1f) != 9 &&
1281 1287
                  (state & 0x1f) != 5 && (state & 0x1f) != 1);
1282 1288
 
1289
+        if ((state & 0x1f) != 5)
1290
+            extradd = 0;
1283 1291
         if ((state & 0x1f) != 9) { // AUD NAL
1284
-            data = av_malloc(pkt->size + 6);
1292
+            data = av_malloc(pkt->size + 6 + extradd);
1285 1293
             if (!data)
1286 1294
                 return AVERROR(ENOMEM);
1287
-            memcpy(data + 6, pkt->data, pkt->size);
1295
+            memcpy(data + 6, st->codec->extradata, extradd);
1296
+            memcpy(data + 6 + extradd, pkt->data, pkt->size);
1288 1297
             AV_WB32(data, 0x00000001);
1289 1298
             data[4] = 0x09;
1290 1299
             data[5] = 0xf0; // any slice type (0xe) + rbsp stop one bit
1291 1300
             buf     = data;
1292
-            size    = pkt->size + 6;
1301
+            size    = pkt->size + 6 + extradd;
1293 1302
         }
1294 1303
     } else if (st->codec->codec_id == AV_CODEC_ID_AAC) {
1295 1304
         if (pkt->size < 2) {