From patchwork Wed Apr 26 19:40:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 3498 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.3.129 with SMTP id 123csp507396vsd; Wed, 26 Apr 2017 12:41:28 -0700 (PDT) X-Received: by 10.28.52.66 with SMTP id b63mr7235230wma.30.1493235688765; Wed, 26 Apr 2017 12:41:28 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r16si187534wrr.241.2017.04.26.12.41.27; Wed, 26 Apr 2017 12:41:28 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B5D626882CD; Wed, 26 Apr 2017 22:41:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f196.google.com (mail-qt0-f196.google.com [209.85.216.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9661C687991 for ; Wed, 26 Apr 2017 22:41:15 +0300 (EEST) Received: by mail-qt0-f196.google.com with SMTP id c45so1678806qtb.0 for ; Wed, 26 Apr 2017 12:41:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=XGVit1UCZI8DEs1kDYT/kCtkzwDeANjbZAgy3ISLBDw=; b=OobBXBDcwd6km6HD5zi01CJXQ4Vk2Lgs6z7WRux/VM+8ZEfoC/OOeRKaJadb7Qcsml JyTh2958SApqP6kcP3+675nfX5whqI7CqmWkvtpNDp5MYGCA+4XOlaA3pgxN4e7G90gk QlGjq3zFoI4cgHkByjhP5amuHtDbSqzwg5k6n1TP2nxpNlXM5PiMiq9XTfd14VfN76DT qfS+i0+yfjFgythB5bFrcJqPT+Prh4gn8agXY+apRtl/lmsxasd7/eilsuJi4d14aJXI Ktcz5k3gBHRHIwc3PnXeqwlELobk7opsqVgmbZ3ZjEzZok/x8oBkSYSPpI7+3PDG8yGI SFfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=XGVit1UCZI8DEs1kDYT/kCtkzwDeANjbZAgy3ISLBDw=; b=lSPfEO7NBn9eIl1hwCXTTFblP/2s15NGaybV+kIeBc7x93/Cn5Zdzuyua1bDZ54l64 i9JmEvwQqYf97VWBO5TJpU+LcxJ8mOw2G36aBZ7liIW9HY6BTLQDTi4cr1DWs0GeeYsy +XSPYXB7alJ7BcS1J97RrlRPMqlMVmItZ2rrz43srCFOYvGFT9v766qdEQmnNq5Ng/q6 MyvWb+MDCVfumF1Is7jrT9K92DpUlUGoYEUBNQ/wRxQyECgtGdwcqjJj+zrsfly+LQtS CCcOWATJKK5TPGwbKS2875AFp4krmkFGCGJIuBzxIMCK+56mLKYPlXzQn+/qfJRTGgPb VJvg== X-Gm-Message-State: AN3rC/6PRRTOC3W02BmNRnexrTJSRN99FiZeOLv3OjYjCTOmUSONfRGR 1b4JT/o7XpWeFeiV X-Received: by 10.200.3.216 with SMTP id z24mr1699477qtg.124.1493235675729; Wed, 26 Apr 2017 12:41:15 -0700 (PDT) Received: from localhost.localdomain ([181.231.62.139]) by smtp.gmail.com with ESMTPSA id x200sm159554qkx.59.2017.04.26.12.41.14 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Apr 2017 12:41:15 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 26 Apr 2017 16:40:55 -0300 Message-Id: <20170426194055.5672-1-jamrial@gmail.com> X-Mailer: git-send-email 2.12.1 Subject: [FFmpeg-devel] [PATCH] avformat/concatdec: port to the new bitstream filter API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: James Almer --- libavformat/concatdec.c | 86 +++++++++++++++---------------------------------- 1 file changed, 26 insertions(+), 60 deletions(-) diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c index dd52e4d366..97ef41e3fc 100644 --- a/libavformat/concatdec.c +++ b/libavformat/concatdec.c @@ -34,8 +34,7 @@ typedef enum ConcatMatchMode { } ConcatMatchMode; typedef struct ConcatStream { - AVBitStreamFilterContext *bsf; - AVCodecContext *avctx; + AVBSFContext *bsf; int out_stream_index; } ConcatStream; @@ -196,7 +195,8 @@ static int detect_stream_specific(AVFormatContext *avf, int idx) ConcatContext *cat = avf->priv_data; AVStream *st = cat->avf->streams[idx]; ConcatStream *cs = &cat->cur_file->streams[idx]; - AVBitStreamFilterContext *bsf; + const AVBitStreamFilter *filter; + AVBSFContext *bsf; int ret; if (cat->auto_convert && st->codecpar->codec_id == AV_CODEC_ID_H264) { @@ -206,29 +206,28 @@ static int detect_stream_specific(AVFormatContext *avf, int idx) return 0; av_log(cat->avf, AV_LOG_INFO, "Auto-inserting h264_mp4toannexb bitstream filter\n"); - if (!(bsf = av_bitstream_filter_init("h264_mp4toannexb"))) { + filter = av_bsf_get_by_name("h264_mp4toannexb"); + if (!filter) { av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb bitstream filter " "required for H.264 streams\n"); return AVERROR_BSF_NOT_FOUND; } + ret = av_bsf_alloc(filter, &bsf); + if (ret < 0) + return ret; cs->bsf = bsf; - cs->avctx = avcodec_alloc_context3(NULL); - if (!cs->avctx) - return AVERROR(ENOMEM); - - /* This really should be part of the bsf work. - Note: input bitstream filtering will not work with bsf that - create extradata from the first packet. */ - av_freep(&st->codecpar->extradata); - st->codecpar->extradata_size = 0; + ret = avcodec_parameters_copy(bsf->par_in, st->codecpar); + if (ret < 0) + return ret; - ret = avcodec_parameters_to_context(cs->avctx, st->codecpar); - if (ret < 0) { - avcodec_free_context(&cs->avctx); + ret = av_bsf_init(bsf); + if (ret < 0) return ret; - } + ret = avcodec_parameters_copy(st->codecpar, bsf->par_out); + if (ret < 0) + return ret; } return 0; } @@ -370,10 +369,8 @@ static int concat_read_close(AVFormatContext *avf) for (i = 0; i < cat->nb_files; i++) { av_freep(&cat->files[i].url); for (j = 0; j < cat->files[i].nb_streams; j++) { - if (cat->files[i].streams[j].avctx) - avcodec_free_context(&cat->files[i].streams[j].avctx); if (cat->files[i].streams[j].bsf) - av_bitstream_filter_close(cat->files[i].streams[j].bsf); + av_bsf_free(&cat->files[i].streams[j].bsf); } av_freep(&cat->files[i].streams); av_dict_free(&cat->files[i].metadata); @@ -524,56 +521,25 @@ static int open_next_file(AVFormatContext *avf) static int filter_packet(AVFormatContext *avf, ConcatStream *cs, AVPacket *pkt) { - AVStream *st = avf->streams[cs->out_stream_index]; - AVBitStreamFilterContext *bsf; - AVPacket pkt2; int ret; av_assert0(cs->out_stream_index >= 0); - for (bsf = cs->bsf; bsf; bsf = bsf->next) { - pkt2 = *pkt; - - ret = av_bitstream_filter_filter(bsf, cs->avctx, NULL, - &pkt2.data, &pkt2.size, - pkt->data, pkt->size, - !!(pkt->flags & AV_PKT_FLAG_KEY)); + if (cs->bsf) { + ret = av_bsf_send_packet(cs->bsf, pkt); if (ret < 0) { + av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb filter " + "failed to send input packet\n"); av_packet_unref(pkt); return ret; } - if (cs->avctx->extradata_size > st->codecpar->extradata_size) { - int eret; - if (st->codecpar->extradata) - av_freep(&st->codecpar->extradata); - - eret = ff_alloc_extradata(st->codecpar, cs->avctx->extradata_size); - if (eret < 0) { - av_packet_unref(pkt); - return AVERROR(ENOMEM); - } - st->codecpar->extradata_size = cs->avctx->extradata_size; - memcpy(st->codecpar->extradata, cs->avctx->extradata, cs->avctx->extradata_size); - } - - av_assert0(pkt2.buf); - if (ret == 0 && pkt2.data != pkt->data) { - if ((ret = av_copy_packet(&pkt2, pkt)) < 0) { - av_free(pkt2.data); - return ret; - } - ret = 1; - } - if (ret > 0) { + ret = av_bsf_receive_packet(cs->bsf, pkt); + if (ret < 0) { + av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb filter " + "failed to receive output packet\n"); av_packet_unref(pkt); - pkt2.buf = av_buffer_create(pkt2.data, pkt2.size, - av_buffer_default_free, NULL, 0); - if (!pkt2.buf) { - av_free(pkt2.data); - return AVERROR(ENOMEM); - } + return ret; } - *pkt = pkt2; } return 0; }