]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/filter_units_bsf.c
avcodec/flacenc: Remove always-true check
[ffmpeg] / libavcodec / filter_units_bsf.c
index bc2ca288dd97ffeb28a27b23380ae3616086c411..354594ac50931ecf31043a779fbd0ff1d31fd24d 100644 (file)
@@ -22,6 +22,7 @@
 #include "libavutil/opt.h"
 
 #include "bsf.h"
+#include "bsf_internal.h"
 #include "cbs.h"
 
 
@@ -98,63 +99,51 @@ invalid:
     return AVERROR(EINVAL);
 }
 
-static int filter_units_filter(AVBSFContext *bsf, AVPacket *out)
+static int filter_units_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     FilterUnitsContext      *ctx = bsf->priv_data;
     CodedBitstreamFragment *frag = &ctx->fragment;
-    AVPacket *in = NULL;
     int err, i, j;
 
-    while (1) {
-        err = ff_bsf_get_packet(bsf, &in);
-        if (err < 0)
-            return err;
+    err = ff_bsf_get_packet_ref(bsf, pkt);
+    if (err < 0)
+        return err;
 
-        if (ctx->mode == NOOP) {
-            av_packet_move_ref(out, in);
-            av_packet_free(&in);
-            return 0;
-        }
+    if (ctx->mode == NOOP)
+        return 0;
 
-        err = ff_cbs_read_packet(ctx->cbc, frag, in);
-        if (err < 0) {
-            av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
-            goto fail;
-        }
+    err = ff_cbs_read_packet(ctx->cbc, frag, pkt);
+    if (err < 0) {
+        av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n");
+        goto fail;
+    }
 
-        for (i = 0; i < frag->nb_units; i++) {
-            for (j = 0; j < ctx->nb_types; j++) {
-                if (frag->units[i].type == ctx->type_list[j])
-                    break;
-            }
-            if (ctx->mode == REMOVE ? j <  ctx->nb_types
-                                    : j >= ctx->nb_types) {
-                ff_cbs_delete_unit(ctx->cbc, frag, i);
-                --i;
-            }
+    for (i = frag->nb_units - 1; i >= 0; i--) {
+        for (j = 0; j < ctx->nb_types; j++) {
+            if (frag->units[i].type == ctx->type_list[j])
+                break;
         }
+        if (ctx->mode == REMOVE ? j <  ctx->nb_types
+                                : j >= ctx->nb_types)
+            ff_cbs_delete_unit(frag, i);
+    }
 
-        if (frag->nb_units > 0)
-            break;
-
+    if (frag->nb_units == 0) {
         // Don't return packets with nothing in them.
-        av_packet_free(&in);
-        ff_cbs_fragment_reset(ctx->cbc, frag);
+        err = AVERROR(EAGAIN);
+        goto fail;
     }
 
-    err = ff_cbs_write_packet(ctx->cbc, out, frag);
+    err = ff_cbs_write_packet(ctx->cbc, pkt, frag);
     if (err < 0) {
         av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n");
         goto fail;
     }
 
-    err = av_packet_copy_props(out, in);
-    if (err < 0)
-        goto fail;
-
 fail:
-    ff_cbs_fragment_reset(ctx->cbc, frag);
-    av_packet_free(&in);
+    if (err < 0)
+        av_packet_unref(pkt);
+    ff_cbs_fragment_reset(frag);
 
     return err;
 }
@@ -210,7 +199,7 @@ static int filter_units_init(AVBSFContext *bsf)
                 av_log(bsf, AV_LOG_ERROR, "Failed to write extradata.\n");
         }
 
-        ff_cbs_fragment_reset(ctx->cbc, frag);
+        ff_cbs_fragment_reset(frag);
     }
 
     return err;
@@ -222,7 +211,7 @@ static void filter_units_close(AVBSFContext *bsf)
 
     av_freep(&ctx->type_list);
 
-    ff_cbs_fragment_free(ctx->cbc, &ctx->fragment);
+    ff_cbs_fragment_free(&ctx->fragment);
     ff_cbs_close(&ctx->cbc);
 }