use global headers to create SPS/PPS when they are available
Fixes Ticket4248
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
... | ... |
@@ -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) { |