diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2015-11-30 03:00:41 -0600 |
---|---|---|
committer | Rodger Combs <rodger.combs@gmail.com> | 2015-12-28 08:40:37 -0600 |
commit | 1b5bd4051d1e394f0429cbf6cf6c137f55857478 (patch) | |
tree | 09d2db5d90676670f889dd81242e4dae77f8efab | |
parent | b287d7ea17f404a51eb3fdca80fa8a8b1fb7dd8b (diff) | |
download | ffmpeg-1b5bd4051d1e394f0429cbf6cf6c137f55857478.tar.gz |
lavf/mpegtsenc: add automatic bitstream filtering
-rw-r--r-- | libavformat/mpegtsenc.c | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index cb11c3121e..2c120430dc 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -717,7 +717,7 @@ static void section_write_packet(MpegTSSection *s, const uint8_t *packet) avio_write(ctx->pb, packet, TS_PACKET_SIZE); } -static int mpegts_write_header(AVFormatContext *s) +static int mpegts_init(AVFormatContext *s) { MpegTSWrite *ts = s->priv_data; MpegTSWriteStream *ts_st; @@ -960,26 +960,6 @@ static int mpegts_write_header(AVFormatContext *s) fail: av_freep(&pids); - for (i = 0; i < s->nb_streams; i++) { - st = s->streams[i]; - ts_st = st->priv_data; - if (ts_st) { - av_freep(&ts_st->payload); - if (ts_st->amux) { - avformat_free_context(ts_st->amux); - ts_st->amux = NULL; - } - } - av_freep(&st->priv_data); - } - - for (i = 0; i < ts->nb_services; i++) { - service = ts->services[i]; - av_freep(&service->provider_name); - av_freep(&service->name); - av_freep(&service); - } - av_freep(&ts->services); return ret; } @@ -1714,20 +1694,27 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) static int mpegts_write_end(AVFormatContext *s) { + if (s->pb) + mpegts_write_flush(s); + + return 0; +} + +static void mpegts_deinit(AVFormatContext *s) +{ MpegTSWrite *ts = s->priv_data; MpegTSService *service; int i; - if (s->pb) - mpegts_write_flush(s); - for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; MpegTSWriteStream *ts_st = st->priv_data; - av_freep(&ts_st->payload); - if (ts_st->amux) { - avformat_free_context(ts_st->amux); - ts_st->amux = NULL; + if (ts_st) { + av_freep(&ts_st->payload); + if (ts_st->amux) { + avformat_free_context(ts_st->amux); + ts_st->amux = NULL; + } } } @@ -1738,8 +1725,24 @@ static int mpegts_write_end(AVFormatContext *s) av_freep(&service); } av_freep(&ts->services); +} - return 0; +static int mpegts_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +{ + int ret = 1; + AVStream *st = s->streams[pkt->stream_index]; + + if (st->codec->codec_id == AV_CODEC_ID_H264) { + if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && + AV_RB24(pkt->data) != 0x000001) + ret = ff_stream_add_bitstream_filter(st, "h264_mp4toannexb", NULL); + } else if (st->codec->codec_id == AV_CODEC_ID_HEVC) { + if (pkt->size >= 5 && AV_RB32(pkt->data) != 0x0000001 && + AV_RB24(pkt->data) != 0x000001) + ret = ff_stream_add_bitstream_filter(st, "hevc_mp4toannexb", NULL); + } + + return ret; } static const AVOption options[] = { @@ -1846,9 +1849,11 @@ AVOutputFormat ff_mpegts_muxer = { .priv_data_size = sizeof(MpegTSWrite), .audio_codec = AV_CODEC_ID_MP2, .video_codec = AV_CODEC_ID_MPEG2VIDEO, - .write_header = mpegts_write_header, + .init = mpegts_init, .write_packet = mpegts_write_packet, .write_trailer = mpegts_write_end, + .deinit = mpegts_deinit, + .check_bitstream = mpegts_check_bitstream, .flags = AVFMT_ALLOW_FLUSH | AVFMT_VARIABLE_FPS, .priv_class = &mpegts_muxer_class, }; |