You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Use context variable repeat_pict for frame duration computation and
document this new use. Patch by Ivan Schreter, schreter gmx net Originally committed as revision 17492 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
				
					committed by
					
						 Carl Eugen Hoyos
						Carl Eugen Hoyos
					
				
			
			
				
	
			
			
			
						parent
						
							f5007cc844
						
					
				
				
					commit
					346db3ef7f
				
			| @@ -3005,6 +3005,18 @@ typedef struct AVCodecParserContext { | ||||
|     int64_t next_frame_offset; /* offset of the next frame */ | ||||
|     /* video info */ | ||||
|     int pict_type; /* XXX: Put it back in AVCodecContext. */ | ||||
|     /** | ||||
|      * This field is used for proper frame duration computation in lavf. | ||||
|      * It signals, how much longer the frame duration of the current frame | ||||
|      * is compared to normal frame duration. | ||||
|      * | ||||
|      * frame_duration = (2 + repeat_pict) / (2*fps) | ||||
|      * | ||||
|      * It is used by codecs like H.264 to display telecined material. | ||||
|      * | ||||
|      * @note This field can also be set to -1 for half-frame duration in case | ||||
|      *       of field pictures. | ||||
|      */ | ||||
|     int repeat_pict; /* XXX: Put it back in AVCodecContext. */ | ||||
|     int64_t pts;     /* pts of the current frame */ | ||||
|     int64_t dts;     /* dts of the current frame */ | ||||
|   | ||||
| @@ -192,6 +192,35 @@ static inline int parse_nal_units(AVCodecParserContext *s, | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if(h->sps.pic_struct_present_flag) { | ||||
|                 switch (h->sei_pic_struct) { | ||||
|                     case SEI_PIC_STRUCT_TOP_FIELD: | ||||
|                     case SEI_PIC_STRUCT_BOTTOM_FIELD: | ||||
|                         s->repeat_pict = -1; | ||||
|                         break; | ||||
|                     case SEI_PIC_STRUCT_FRAME: | ||||
|                     case SEI_PIC_STRUCT_TOP_BOTTOM: | ||||
|                     case SEI_PIC_STRUCT_BOTTOM_TOP: | ||||
|                         s->repeat_pict = 0; | ||||
|                         break; | ||||
|                     case SEI_PIC_STRUCT_TOP_BOTTOM_TOP: | ||||
|                     case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM: | ||||
|                         s->repeat_pict = 1; | ||||
|                         break; | ||||
|                     case SEI_PIC_STRUCT_FRAME_DOUBLING: | ||||
|                         s->repeat_pict = 2; | ||||
|                         break; | ||||
|                     case SEI_PIC_STRUCT_FRAME_TRIPLING: | ||||
|                         s->repeat_pict = 4; | ||||
|                         break; | ||||
|                     default: | ||||
|                         s->repeat_pict = h->s.picture_structure == PICT_FRAME ? 0 : -1; | ||||
|                         break; | ||||
|                 } | ||||
|             } else { | ||||
|                 s->repeat_pict = h->s.picture_structure == PICT_FRAME ? 0 : -1; | ||||
|             } | ||||
|  | ||||
|             return 0; /* no need to evaluate the rest */ | ||||
|         } | ||||
|         buf += consumed; | ||||
|   | ||||
| @@ -680,6 +680,8 @@ static void compute_frame_duration(int *pnum, int *pden, AVStream *st, | ||||
|             *pnum = st->codec->time_base.num; | ||||
|             *pden = st->codec->time_base.den; | ||||
|             if (pc && pc->repeat_pict) { | ||||
|                 // NOTE: repeat_pict can be also -1 for half-frame durations, | ||||
|                 // e.g., in H.264 interlaced field picture stream | ||||
|                 *pden *= 2; | ||||
|                 *pnum = (*pnum) * (2 + pc->repeat_pict); | ||||
|             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user