You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avcodec/cbs: add API to discard units by AVDiscard
This commit is contained in:
		| @@ -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, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user