avcodec/cbs: add API to discard units by AVDiscard

pull/389/head
Zhao Zhili 2 years ago
parent 5e9986fd2d
commit a8aeab107e
  1. 21
      libavcodec/cbs.c
  2. 17
      libavcodec/cbs.h
  3. 6
      libavcodec/cbs_internal.h

@ -1026,3 +1026,24 @@ int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx,
av_buffer_unref(&ref);
return 0;
}
void ff_cbs_discard_units(CodedBitstreamContext *ctx,
CodedBitstreamFragment *frag,
enum AVDiscard skip,
int flags)
{
if (!ctx->codec->discarded_unit)
return;
for (int i = frag->nb_units - 1; i >= 0; i--) {
if (ctx->codec->discarded_unit(ctx, &frag->units[i], skip)) {
// discard all units
if (!(flags & DISCARD_FLAG_KEEP_NON_VCL)) {
ff_cbs_fragment_free(frag);
return;
}
ff_cbs_delete_unit(frag, i);
}
}
}

@ -26,6 +26,7 @@
#include "codec_id.h"
#include "codec_par.h"
#include "defs.h"
#include "packet.h"
@ -432,5 +433,21 @@ int ff_cbs_make_unit_refcounted(CodedBitstreamContext *ctx,
int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx,
CodedBitstreamUnit *unit);
enum CbsDiscardFlags {
DISCARD_FLAG_NONE = 0,
/**
* keep non-vcl units even if the picture has been dropped.
*/
DISCARD_FLAG_KEEP_NON_VCL = 0x01,
};
/**
* Discard units accroding to 'skip'.
*/
void ff_cbs_discard_units(CodedBitstreamContext *ctx,
CodedBitstreamFragment *frag,
enum AVDiscard skip,
int flags);
#endif /* AVCODEC_CBS_H */

@ -133,6 +133,12 @@ typedef struct CodedBitstreamType {
CodedBitstreamUnit *unit,
PutBitContext *pbc);
// Return 1 when the unit should be dropped according to 'skip',
// 0 otherwise.
int (*discarded_unit)(CodedBitstreamContext *ctx,
const CodedBitstreamUnit *unit,
enum AVDiscard skip);
// Read the data from all of frag->units and assemble it into
// a bitstream for the whole fragment.
int (*assemble_fragment)(CodedBitstreamContext *ctx,

Loading…
Cancel
Save