[FFmpeg-devel] [PATCH 3/6] lavf/tee: use lavf API for applying bitstream filters

Rodger Combs rodger.combs at gmail.com
Wed Nov 25 22:26:22 CET 2015


---
 libavformat/tee.c | 44 +++-----------------------------------------
 1 file changed, 3 insertions(+), 41 deletions(-)

diff --git a/libavformat/tee.c b/libavformat/tee.c
index af52a49..8c54d32 100644
--- a/libavformat/tee.c
+++ b/libavformat/tee.c
@@ -405,45 +405,6 @@ fail:
     return ret;
 }
 
-static int filter_packet(void *log_ctx, AVPacket *pkt,
-                         AVFormatContext *fmt_ctx, AVBitStreamFilterContext *bsf_ctx)
-{
-    AVCodecContext *enc_ctx = fmt_ctx->streams[pkt->stream_index]->codec;
-    int ret = 0;
-
-    while (bsf_ctx) {
-        AVPacket new_pkt = *pkt;
-        ret = av_bitstream_filter_filter(bsf_ctx, enc_ctx, NULL,
-                                             &new_pkt.data, &new_pkt.size,
-                                             pkt->data, pkt->size,
-                                             pkt->flags & AV_PKT_FLAG_KEY);
-        if (ret == 0 && new_pkt.data != pkt->data) {
-            if ((ret = av_copy_packet(&new_pkt, pkt)) < 0)
-                break;
-            ret = 1;
-        }
-
-        if (ret > 0) {
-            av_packet_unref(pkt);
-            new_pkt.buf = av_buffer_create(new_pkt.data, new_pkt.size,
-                                           av_buffer_default_free, NULL, 0);
-            if (!new_pkt.buf)
-                break;
-        }
-        if (ret < 0) {
-            av_log(log_ctx, AV_LOG_ERROR,
-                "Failed to filter bitstream with filter %s for stream %d in file '%s' with codec %s\n",
-                bsf_ctx->filter->name, pkt->stream_index, fmt_ctx->filename,
-                avcodec_get_name(enc_ctx->codec_id));
-        }
-        *pkt = new_pkt;
-
-        bsf_ctx = bsf_ctx->next;
-    }
-
-    return ret;
-}
-
 static int tee_write_trailer(AVFormatContext *avf)
 {
     TeeContext *tee = avf->priv_data;
@@ -496,8 +457,9 @@ static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
         pkt2.duration = av_rescale_q(pkt->duration, tb, tb2);
         pkt2.stream_index = s2;
 
-        filter_packet(avf2, &pkt2, avf2, tee->slaves[i].bsfs[s2]);
-        if ((ret = av_interleaved_write_frame(avf2, &pkt2)) < 0)
+        if ((ret = av_apply_bitstream_filters(avf2->streams[s2]->codec, &pkt2,
+                                              tee->slaves[i].bsfs[s2])) < 0 ||
+            (ret = av_interleaved_write_frame(avf2, &pkt2)) < 0)
             if (!ret_all)
                 ret_all = ret;
     }
-- 
2.6.3



More information about the ffmpeg-devel mailing list