From patchwork Sat Apr 29 00:27:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 3513 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.3.129 with SMTP id 123csp493165vsd; Fri, 28 Apr 2017 17:33:58 -0700 (PDT) X-Received: by 10.223.134.118 with SMTP id 51mr9878612wrw.75.1493426038231; Fri, 28 Apr 2017 17:33:58 -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 91si8009885wrs.86.2017.04.28.17.33.57; Fri, 28 Apr 2017 17:33:58 -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 E488B6891E9; Sat, 29 Apr 2017 03:33:52 +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 6CBA9688371 for ; Sat, 29 Apr 2017 03:33:46 +0300 (EEST) Received: by mail-qt0-f196.google.com with SMTP id y33so10485524qta.1 for ; Fri, 28 Apr 2017 17:33:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=8jZRh5AqSip7EpN1RbXj4OKlfAl+tAfUpfqH4XhO9OU=; b=cn3XdJ4YYmCtn1tLX4LncSlYZ8qW3gV6oOah54zbftXX1X04gcGfd2tOZyXv7j1rKe 5iYGS+nLoD04GtX6VlRSvHP8rmXBoens95trw8dI95a4/TG5CQF+mFdmjjEC+pXJRFwe fRnp0YV6QeAYizwP0mBFkudf2nr3Yr5O12IC6ysCVowFFVazQJ+SlL9Ti1yMaSkl6TXA mQfiTvzDYNxGRYwuuyPzMTjOyzmAW8DEriBqy/eUKAVUvAsCxSfDjBlsUknUlr7yEUt5 46eO514+M3U0alxvLw9WQpIM/IuEP5Iwhd0Vy21n7pKCedCM7rQxBjAQmBfRmOatv5mS tXow== 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:in-reply-to :references; bh=8jZRh5AqSip7EpN1RbXj4OKlfAl+tAfUpfqH4XhO9OU=; b=F7wvie8MavIpq6Z5/0LfiMa36kYNlw5mLpXbVH+Jldm/WJ0F9IV130eVcPWih2CMsE IRp17oJi+Vewc736w1rOWd48n/rA2gVc3riTKlRjllXKXGk5LP5U5uuYHqpHlD71ljgR c/TWMYQM+6PEtUsDmA7NGqUPqbfjNWEunEsbIMqP9U7hwx4l8+tAbFqvHn4JaUd64my4 suqQGpPKXAbQdsOldHMwaS3x24Qe1VKBmlMioeT6twVTsDGcncvugqY1cwG5/+orYYYb +cF6z6xvdm4gW/67LwOEJzE1Aq2Hk+sSK7x5gCRp3D3ehJX+FIr7NCj7LDj1hheElrNK uX9w== X-Gm-Message-State: AN3rC/7UYaIbbmWgKUPWFIx0bwmzZXITsk06hTarxwwduG0I4eEqHdMz xSYn0HQDsvjR5HdV X-Received: by 10.200.54.7 with SMTP id m7mr12226482qtb.177.1493425710505; Fri, 28 Apr 2017 17:28:30 -0700 (PDT) Received: from localhost.localdomain ([181.231.62.139]) by smtp.gmail.com with ESMTPSA id f7sm4549362qtb.30.2017.04.28.17.28.29 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 28 Apr 2017 17:28:30 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Fri, 28 Apr 2017 21:27:56 -0300 Message-Id: <20170429002756.1184-1-jamrial@gmail.com> X-Mailer: git-send-email 2.12.1 In-Reply-To: <20170428015947.GW4714@nb4> References: <20170428015947.GW4714@nb4> 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 | 94 ++++++++++++++++--------------------------------- 1 file changed, 30 insertions(+), 64 deletions(-) diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c index dd52e4d366..fa9443ff78 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; } @@ -291,8 +290,11 @@ static int match_streams(AVFormatContext *avf) memset(map + cat->cur_file->nb_streams, 0, (cat->avf->nb_streams - cat->cur_file->nb_streams) * sizeof(*map)); - for (i = cat->cur_file->nb_streams; i < cat->avf->nb_streams; i++) + for (i = cat->cur_file->nb_streams; i < cat->avf->nb_streams; i++) { map[i].out_stream_index = -1; + if ((ret = detect_stream_specific(avf, i)) < 0) + return ret; + } switch (cat->stream_match_mode) { case MATCH_ONE_TO_ONE: ret = match_streams_one_to_one(avf); @@ -305,9 +307,6 @@ static int match_streams(AVFormatContext *avf) } if (ret < 0) return ret; - for (i = cat->cur_file->nb_streams; i < cat->avf->nb_streams; i++) - if ((ret = detect_stream_specific(avf, i)) < 0) - return ret; cat->cur_file->nb_streams = cat->avf->nb_streams; 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; }