avcodec/cbs: add API to discard units by AVDiscard
This commit is contained in:
		
							parent
							
								
									5e9986fd2d
								
							
						
					
					
						commit
						a8aeab107e
					
				| @ -1026,3 +1026,24 @@ int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, | |||||||
|     av_buffer_unref(&ref); |     av_buffer_unref(&ref); | ||||||
|     return 0; |     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_id.h" | ||||||
| #include "codec_par.h" | #include "codec_par.h" | ||||||
|  | #include "defs.h" | ||||||
| #include "packet.h" | #include "packet.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -432,5 +433,21 @@ int ff_cbs_make_unit_refcounted(CodedBitstreamContext *ctx, | |||||||
| int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, | int ff_cbs_make_unit_writable(CodedBitstreamContext *ctx, | ||||||
|                               CodedBitstreamUnit *unit); |                               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 */ | #endif /* AVCODEC_CBS_H */ | ||||||
|  | |||||||
| @ -133,6 +133,12 @@ typedef struct CodedBitstreamType { | |||||||
|                       CodedBitstreamUnit *unit, |                       CodedBitstreamUnit *unit, | ||||||
|                       PutBitContext *pbc); |                       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
 |     // Read the data from all of frag->units and assemble it into
 | ||||||
|     // a bitstream for the whole fragment.
 |     // a bitstream for the whole fragment.
 | ||||||
|     int (*assemble_fragment)(CodedBitstreamContext *ctx, |     int (*assemble_fragment)(CodedBitstreamContext *ctx, | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user