comparison h263.c @ 2637:ef44d24680d1 libavcodec

switch to native time bases
author michael
date Sat, 30 Apr 2005 21:43:59 +0000
parents 67171616ead6
children e2780f828440
comparison
equal deleted inserted replaced
2636:2344c6713011 2637:ef44d24680d1
158 158
159 align_put_bits(&s->pb); 159 align_put_bits(&s->pb);
160 160
161 put_bits(&s->pb, 17, 1); 161 put_bits(&s->pb, 17, 1);
162 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */ 162 put_bits(&s->pb, 5, (s->h263_flv-1)); /* 0: h263 escape codes 1: 11-bit escape codes */
163 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) / 163 put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->time_base.num) / //FIXME use timestamp
164 s->avctx->frame_rate) & 0xff); /* TemporalReference */ 164 s->avctx->time_base.den) & 0xff); /* TemporalReference */
165 if (s->width == 352 && s->height == 288) 165 if (s->width == 352 && s->height == 288)
166 format = 2; 166 format = 2;
167 else if (s->width == 176 && s->height == 144) 167 else if (s->width == 176 && s->height == 144)
168 format = 3; 168 format = 3;
169 else if (s->width == 128 && s->height == 96) 169 else if (s->width == 128 && s->height == 96)
206 int best_error= INT_MAX; 206 int best_error= INT_MAX;
207 207
208 if(s->h263_plus){ 208 if(s->h263_plus){
209 for(i=0; i<2; i++){ 209 for(i=0; i<2; i++){
210 int div, error; 210 int div, error;
211 div= (s->avctx->frame_rate_base*1800000LL + 500LL*s->avctx->frame_rate) / ((1000LL+i)*s->avctx->frame_rate); 211 div= (s->avctx->time_base.num*1800000LL + 500LL*s->avctx->time_base.den) / ((1000LL+i)*s->avctx->time_base.den);
212 div= clip(1, div, 127); 212 div= clip(1, div, 127);
213 error= ABS(s->avctx->frame_rate_base*1800000LL - (1000LL+i)*s->avctx->frame_rate*div); 213 error= ABS(s->avctx->time_base.num*1800000LL - (1000LL+i)*s->avctx->time_base.den*div);
214 if(error < best_error){ 214 if(error < best_error){
215 best_error= error; 215 best_error= error;
216 best_divisor= div; 216 best_divisor= div;
217 best_clock_code= i; 217 best_clock_code= i;
218 } 218 }
225 align_put_bits(&s->pb); 225 align_put_bits(&s->pb);
226 226
227 /* Update the pointer to last GOB */ 227 /* Update the pointer to last GOB */
228 s->ptr_lastgob = pbBufPtr(&s->pb); 228 s->ptr_lastgob = pbBufPtr(&s->pb);
229 put_bits(&s->pb, 22, 0x20); /* PSC */ 229 put_bits(&s->pb, 22, 0x20); /* PSC */
230 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->frame_rate_base / 230 temp_ref= s->picture_number * (int64_t)coded_frame_rate * s->avctx->time_base.num / //FIXME use timestamp
231 (coded_frame_rate_base * (int64_t)s->avctx->frame_rate); 231 (coded_frame_rate_base * (int64_t)s->avctx->time_base.den);
232 put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */ 232 put_bits(&s->pb, 8, temp_ref & 0xff); /* TemporalReference */
233 233
234 put_bits(&s->pb, 1, 1); /* marker */ 234 put_bits(&s->pb, 1, 1); /* marker */
235 put_bits(&s->pb, 1, 0); /* h263 id */ 235 put_bits(&s->pb, 1, 0); /* h263 id */
236 put_bits(&s->pb, 1, 0); /* split screen off */ 236 put_bits(&s->pb, 1, 0); /* split screen off */
2208 /* must be called before writing the header */ 2208 /* must be called before writing the header */
2209 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){ 2209 void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){
2210 int time_div, time_mod; 2210 int time_div, time_mod;
2211 2211
2212 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE); 2212 assert(s->current_picture_ptr->pts != AV_NOPTS_VALUE);
2213 s->time= (s->current_picture_ptr->pts*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE; 2213 s->time= s->current_picture_ptr->pts*s->avctx->time_base.num;
2214 2214
2215 time_div= s->time/s->time_increment_resolution; 2215 time_div= s->time/s->avctx->time_base.den;
2216 time_mod= s->time%s->time_increment_resolution; 2216 time_mod= s->time%s->avctx->time_base.den;
2217 2217
2218 if(s->pict_type==B_TYPE){ 2218 if(s->pict_type==B_TYPE){
2219 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); 2219 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
2220 assert(s->pb_time > 0 && s->pb_time < s->pp_time); 2220 assert(s->pb_time > 0 && s->pb_time < s->pp_time);
2221 }else{ 2221 }else{
2235 put_bits(&s->pb, 16, GOP_STARTCODE); 2235 put_bits(&s->pb, 16, GOP_STARTCODE);
2236 2236
2237 time= s->current_picture_ptr->pts; 2237 time= s->current_picture_ptr->pts;
2238 if(s->reordered_input_picture[1]) 2238 if(s->reordered_input_picture[1])
2239 time= FFMIN(time, s->reordered_input_picture[1]->pts); 2239 time= FFMIN(time, s->reordered_input_picture[1]->pts);
2240 time= (time*s->time_increment_resolution + AV_TIME_BASE/2)/AV_TIME_BASE; 2240 time= time*s->avctx->time_base.num;
2241 2241
2242 seconds= time/s->time_increment_resolution; 2242 seconds= time/s->avctx->time_base.den;
2243 minutes= seconds/60; seconds %= 60; 2243 minutes= seconds/60; seconds %= 60;
2244 hours= minutes/60; minutes %= 60; 2244 hours= minutes/60; minutes %= 60;
2245 hours%=24; 2245 hours%=24;
2246 2246
2247 put_bits(&s->pb, 5, hours); 2247 put_bits(&s->pb, 5, hours);
2250 put_bits(&s->pb, 6, seconds); 2250 put_bits(&s->pb, 6, seconds);
2251 2251
2252 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP)); 2252 put_bits(&s->pb, 1, !!(s->flags&CODEC_FLAG_CLOSED_GOP));
2253 put_bits(&s->pb, 1, 0); //broken link == NO 2253 put_bits(&s->pb, 1, 0); //broken link == NO
2254 2254
2255 s->last_time_base= time / s->time_increment_resolution; 2255 s->last_time_base= time / s->avctx->time_base.den;
2256 2256
2257 ff_mpeg4_stuffing(&s->pb); 2257 ff_mpeg4_stuffing(&s->pb);
2258 } 2258 }
2259 2259
2260 static void mpeg4_encode_visual_object_header(MpegEncContext * s){ 2260 static void mpeg4_encode_visual_object_header(MpegEncContext * s){
2347 } 2347 }
2348 2348
2349 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */ 2349 put_bits(&s->pb, 2, RECT_SHAPE); /* vol shape= rectangle */
2350 put_bits(&s->pb, 1, 1); /* marker bit */ 2350 put_bits(&s->pb, 1, 1); /* marker bit */
2351 2351
2352 put_bits(&s->pb, 16, s->time_increment_resolution); 2352 put_bits(&s->pb, 16, s->avctx->time_base.den);
2353 if (s->time_increment_bits < 1) 2353 if (s->time_increment_bits < 1)
2354 s->time_increment_bits = 1; 2354 s->time_increment_bits = 1;
2355 put_bits(&s->pb, 1, 1); /* marker bit */ 2355 put_bits(&s->pb, 1, 1); /* marker bit */
2356 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */ 2356 put_bits(&s->pb, 1, 0); /* fixed vop rate=no */
2357 put_bits(&s->pb, 1, 1); /* marker bit */ 2357 put_bits(&s->pb, 1, 1); /* marker bit */
2418 mpeg4_encode_gop_header(s); 2418 mpeg4_encode_gop_header(s);
2419 } 2419 }
2420 2420
2421 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE; 2421 s->partitioned_frame= s->data_partitioning && s->pict_type!=B_TYPE;
2422 2422
2423 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->frame_rate, FRAME_RATE_BASE); 2423 //printf("num:%d rate:%d base:%d\n", s->picture_number, s->time_base.den, FRAME_RATE_BASE);
2424 2424
2425 put_bits(&s->pb, 16, 0); /* vop header */ 2425 put_bits(&s->pb, 16, 0); /* vop header */
2426 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */ 2426 put_bits(&s->pb, 16, VOP_STARTCODE); /* vop header */
2427 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */ 2427 put_bits(&s->pb, 2, s->pict_type - 1); /* pict type: I = 0 , P = 1 */
2428 2428
2429 time_div= s->time/s->time_increment_resolution; 2429 time_div= s->time/s->avctx->time_base.den;
2430 time_mod= s->time%s->time_increment_resolution; 2430 time_mod= s->time%s->avctx->time_base.den;
2431 time_incr= time_div - s->last_time_base; 2431 time_incr= time_div - s->last_time_base;
2432 assert(time_incr >= 0); 2432 assert(time_incr >= 0);
2433 while(time_incr--) 2433 while(time_incr--)
2434 put_bits(&s->pb, 1, 1); 2434 put_bits(&s->pb, 1, 1);
2435 2435
5052 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ 5052 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
5053 5053
5054 s->width = width; 5054 s->width = width;
5055 s->height = height; 5055 s->height = height;
5056 s->avctx->sample_aspect_ratio= (AVRational){12,11}; 5056 s->avctx->sample_aspect_ratio= (AVRational){12,11};
5057 s->avctx->frame_rate = 30000; 5057 s->avctx->time_base= (AVRational){1001, 30000};
5058 s->avctx->frame_rate_base= 1001;
5059 } else { 5058 } else {
5060 int ufep; 5059 int ufep;
5061 5060
5062 /* H.263v2 */ 5061 /* H.263v2 */
5063 s->h263_plus = 1; 5062 s->h263_plus = 1;
5148 s->width = width; 5147 s->width = width;
5149 s->height = height; 5148 s->height = height;
5150 5149
5151 if(s->custom_pcf){ 5150 if(s->custom_pcf){
5152 int gcd; 5151 int gcd;
5153 s->avctx->frame_rate= 1800000; 5152 s->avctx->time_base.den= 1800000;
5154 s->avctx->frame_rate_base= 1000 + get_bits1(&s->gb); 5153 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
5155 s->avctx->frame_rate_base*= get_bits(&s->gb, 7); 5154 s->avctx->time_base.num*= get_bits(&s->gb, 7);
5156 if(s->avctx->frame_rate_base == 0){ 5155 if(s->avctx->time_base.num == 0){
5157 av_log(s, AV_LOG_ERROR, "zero framerate\n"); 5156 av_log(s, AV_LOG_ERROR, "zero framerate\n");
5158 return -1; 5157 return -1;
5159 } 5158 }
5160 gcd= ff_gcd(s->avctx->frame_rate, s->avctx->frame_rate_base); 5159 gcd= ff_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
5161 s->avctx->frame_rate /= gcd; 5160 s->avctx->time_base.den /= gcd;
5162 s->avctx->frame_rate_base /= gcd; 5161 s->avctx->time_base.num /= gcd;
5163 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->frame_rate, s->avctx->frame_rate_base); 5162 // av_log(s->avctx, AV_LOG_DEBUG, "%d/%d\n", s->avctx->time_base.den, s->avctx->time_base.num);
5164 }else{ 5163 }else{
5165 s->avctx->frame_rate = 30000; 5164 s->avctx->time_base= (AVRational){1001, 30000};
5166 s->avctx->frame_rate_base= 1001;
5167 } 5165 }
5168 } 5166 }
5169 5167
5170 if(s->custom_pcf){ 5168 if(s->custom_pcf){
5171 skip_bits(&s->gb, 2); //extended Temporal reference 5169 skip_bits(&s->gb, 2); //extended Temporal reference
5232 s->h263_aic ? " AIC" : "", 5230 s->h263_aic ? " AIC" : "",
5233 s->alt_inter_vlc ? " AIV" : "", 5231 s->alt_inter_vlc ? " AIV" : "",
5234 s->modified_quant ? " MQ" : "", 5232 s->modified_quant ? " MQ" : "",
5235 s->loop_filter ? " LOOP" : "", 5233 s->loop_filter ? " LOOP" : "",
5236 s->h263_slice_structured ? " SS" : "", 5234 s->h263_slice_structured ? " SS" : "",
5237 s->avctx->frame_rate, s->avctx->frame_rate_base 5235 s->avctx->time_base.den, s->avctx->time_base.num
5238 ); 5236 );
5239 } 5237 }
5240 #if 1 5238 #if 1
5241 if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){ 5239 if (s->pict_type == I_TYPE && s->avctx->codec_tag == ff_get_fourcc("ZYGO")){
5242 int i,j; 5240 int i,j;
5535 skip_bits(gb, 4); //video_object_layer_shape_extension 5533 skip_bits(gb, 4); //video_object_layer_shape_extension
5536 } 5534 }
5537 5535
5538 check_marker(gb, "before time_increment_resolution"); 5536 check_marker(gb, "before time_increment_resolution");
5539 5537
5540 s->time_increment_resolution = get_bits(gb, 16); 5538 s->avctx->time_base.den = get_bits(gb, 16);
5541 5539
5542 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1; 5540 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
5543 if (s->time_increment_bits < 1) 5541 if (s->time_increment_bits < 1)
5544 s->time_increment_bits = 1; 5542 s->time_increment_bits = 1;
5545 5543
5546 check_marker(gb, "before fixed_vop_rate"); 5544 check_marker(gb, "before fixed_vop_rate");
5547 5545
5548 if (get_bits1(gb) != 0) { /* fixed_vop_rate */ 5546 if (get_bits1(gb) != 0) { /* fixed_vop_rate */
5549 skip_bits(gb, s->time_increment_bits); 5547 s->avctx->time_base.num = get_bits(gb, s->time_increment_bits);
5550 } 5548 }else
5551 5549 s->avctx->time_base.num = 1;
5550
5552 s->t_frame=0; 5551 s->t_frame=0;
5553 5552
5554 if (s->shape != BIN_ONLY_SHAPE) { 5553 if (s->shape != BIN_ONLY_SHAPE) {
5555 if (s->shape == RECT_SHAPE) { 5554 if (s->shape == RECT_SHAPE) {
5556 skip_bits1(gb); /* marker */ 5555 skip_bits1(gb); /* marker */
5797 if(s->partitioned_frame) 5796 if(s->partitioned_frame)
5798 s->decode_mb= mpeg4_decode_partitioned_mb; 5797 s->decode_mb= mpeg4_decode_partitioned_mb;
5799 else 5798 else
5800 s->decode_mb= ff_mpeg4_decode_mb; 5799 s->decode_mb= ff_mpeg4_decode_mb;
5801 5800
5802 if(s->time_increment_resolution==0){ 5801 if(s->avctx->time_base.den==0){
5803 s->time_increment_resolution=1; 5802 s->avctx->time_base.den=1;
5804 // fprintf(stderr, "time_increment_resolution is illegal\n"); 5803 // fprintf(stderr, "time_increment_resolution is illegal\n");
5805 } 5804 }
5806 time_incr=0; 5805 time_incr=0;
5807 while (get_bits1(gb) != 0) 5806 while (get_bits1(gb) != 0)
5808 time_incr++; 5807 time_incr++;
5825 // printf("%d %X\n", s->time_increment_bits, time_increment); 5824 // printf("%d %X\n", s->time_increment_bits, time_increment);
5826 //av_log(s->avctx, AV_LOG_DEBUG, " type:%d modulo_time_base:%d increment:%d t_frame %d\n", s->pict_type, time_incr, time_increment, s->t_frame); 5825 //av_log(s->avctx, AV_LOG_DEBUG, " type:%d modulo_time_base:%d increment:%d t_frame %d\n", s->pict_type, time_incr, time_increment, s->t_frame);
5827 if(s->pict_type!=B_TYPE){ 5826 if(s->pict_type!=B_TYPE){
5828 s->last_time_base= s->time_base; 5827 s->last_time_base= s->time_base;
5829 s->time_base+= time_incr; 5828 s->time_base+= time_incr;
5830 s->time= s->time_base*s->time_increment_resolution + time_increment; 5829 s->time= s->time_base*s->avctx->time_base.den + time_increment;
5831 if(s->workaround_bugs&FF_BUG_UMP4){ 5830 if(s->workaround_bugs&FF_BUG_UMP4){
5832 if(s->time < s->last_non_b_time){ 5831 if(s->time < s->last_non_b_time){
5833 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n"); 5832 // fprintf(stderr, "header is not mpeg4 compatible, broken encoder, trying to workaround\n");
5834 s->time_base++; 5833 s->time_base++;
5835 s->time+= s->time_increment_resolution; 5834 s->time+= s->avctx->time_base.den;
5836 } 5835 }
5837 } 5836 }
5838 s->pp_time= s->time - s->last_non_b_time; 5837 s->pp_time= s->time - s->last_non_b_time;
5839 s->last_non_b_time= s->time; 5838 s->last_non_b_time= s->time;
5840 }else{ 5839 }else{
5841 s->time= (s->last_time_base + time_incr)*s->time_increment_resolution + time_increment; 5840 s->time= (s->last_time_base + time_incr)*s->avctx->time_base.den + time_increment;
5842 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); 5841 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
5843 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){ 5842 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
5844 // printf("messed up order, maybe after seeking? skipping current b frame\n"); 5843 // printf("messed up order, maybe after seeking? skipping current b frame\n");
5845 return FRAME_SKIPPED; 5844 return FRAME_SKIPPED;
5846 } 5845 }
5852 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame) 5851 s->pb_field_time= ( ROUNDED_DIV(s->time, s->t_frame)
5853 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2; 5852 - ROUNDED_DIV(s->last_non_b_time - s->pp_time, s->t_frame))*2;
5854 } 5853 }
5855 //av_log(s->avctx, AV_LOG_DEBUG, "last nonb %Ld last_base %d time %Ld pp %d pb %d t %d ppf %d pbf %d\n", s->last_non_b_time, s->last_time_base, s->time, s->pp_time, s->pb_time, s->t_frame, s->pp_field_time, s->pb_field_time); 5854 //av_log(s->avctx, AV_LOG_DEBUG, "last nonb %Ld last_base %d time %Ld pp %d pb %d t %d ppf %d pbf %d\n", s->last_non_b_time, s->last_time_base, s->time, s->pp_time, s->pb_time, s->t_frame, s->pp_field_time, s->pb_field_time);
5856 5855
5857 s->current_picture_ptr->pts= s->time*(int64_t)AV_TIME_BASE / s->time_increment_resolution; 5856 s->current_picture_ptr->pts= (s->time + s->avctx->time_base.num/2) / s->avctx->time_base.num;
5858 if(s->avctx->debug&FF_DEBUG_PTS) 5857 if(s->avctx->debug&FF_DEBUG_PTS)
5859 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts/(float)AV_TIME_BASE); 5858 av_log(s->avctx, AV_LOG_DEBUG, "MPEG4 PTS: %f\n", s->current_picture_ptr->pts);
5860 5859
5861 check_marker(gb, "before vop_coded"); 5860 check_marker(gb, "before vop_coded");
5862 5861
5863 /* vop coded */ 5862 /* vop coded */
5864 if (get_bits1(gb) != 1){ 5863 if (get_bits1(gb) != 1){
5865 if(s->avctx->debug&FF_DEBUG_PICT_INFO) 5864 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
5866 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n"); 5865 av_log(s->avctx, AV_LOG_ERROR, "vop not coded\n");
5867 return FRAME_SKIPPED; 5866 return FRAME_SKIPPED;
5868 } 5867 }
5869 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->time_increment_resolution, s->time_base, 5868 //printf("time %d %d %d || %Ld %Ld %Ld\n", s->time_increment_bits, s->avctx->time_base.den, s->time_base,
5870 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time); 5869 //s->time, s->last_non_b_time, s->last_non_b_time - s->pp_time);
5871 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE 5870 if (s->shape != BIN_ONLY_SHAPE && ( s->pict_type == P_TYPE
5872 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) { 5871 || (s->pict_type == S_TYPE && s->vol_sprite_usage==GMC_SPRITE))) {
5873 /* rounding type for motion estimation */ 5872 /* rounding type for motion estimation */
5874 s->no_rounding = get_bits1(gb); 5873 s->no_rounding = get_bits1(gb);