lavc: Add a flag in AVPacket to discard packet after decoding. Discard frames after decoding based on the flag.
Signed-off-by: Sasi Inguva <isasi@google.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
		
							parent
							
								
									778af68c70
								
							
						
					
					
						commit
						2dbedc20ce
					
				| @ -1621,6 +1621,12 @@ typedef struct AVPacket { | ||||
| } AVPacket; | ||||
| #define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
 | ||||
| #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
 | ||||
| /**
 | ||||
|  * Flag is used to discard packets which are required to maintain valid | ||||
|  * decoder state but are not required for output and should be dropped | ||||
|  * after decoding. | ||||
|  **/ | ||||
| #define AV_PKT_FLAG_DISCARD   0x0004 | ||||
| 
 | ||||
| enum AVSideDataParamChangeFlags { | ||||
|     AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001, | ||||
|  | ||||
| @ -784,6 +784,12 @@ int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame) | ||||
|             } | ||||
|         } | ||||
|         add_metadata_from_side_data(pkt, frame); | ||||
| 
 | ||||
|         if (pkt->flags & AV_PKT_FLAG_DISCARD) { | ||||
|             frame->flags |= AV_FRAME_FLAG_DISCARD; | ||||
|         } else { | ||||
|             frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD); | ||||
|         } | ||||
|     } else { | ||||
|         frame->pkt_pts = AV_NOPTS_VALUE; | ||||
|         av_frame_set_pkt_pos     (frame, -1); | ||||
| @ -2247,7 +2253,9 @@ fail: | ||||
|             if(ret == tmp.size) | ||||
|                 ret = avpkt->size; | ||||
|         } | ||||
| 
 | ||||
|         if (picture->flags & AV_FRAME_FLAG_DISCARD) { | ||||
|             *got_picture_ptr = 0; | ||||
|         } | ||||
|         if (*got_picture_ptr) { | ||||
|             if (!avctx->refcounted_frames) { | ||||
|                 int err = unrefcount_frame(avci, picture); | ||||
| @ -2343,6 +2351,11 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx, | ||||
|                 frame->sample_rate = avctx->sample_rate; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         if (frame->flags & AV_FRAME_FLAG_DISCARD) { | ||||
|             *got_frame_ptr = 0; | ||||
|         } | ||||
| 
 | ||||
|         side= av_packet_get_side_data(avctx->internal->pkt, AV_PKT_DATA_SKIP_SAMPLES, &side_size); | ||||
|         if(side && side_size>=10) { | ||||
|             avctx->internal->skip_samples = AV_RL32(side); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user