Mercurial > libavcodec.hg
comparison mpeg12.c @ 1126:77ccf7fe3bd0 libavcodec
per context frame_rate_base, this should finally fix frame_rate related av sync issues
author | michaelni |
---|---|
date | Wed, 12 Mar 2003 15:16:19 +0000 |
parents | 1e39f273ecd6 |
children | e10e841c9bf0 |
comparison
equal
deleted
inserted
replaced
1125:0980ae063f4e | 1126:77ccf7fe3bd0 |
---|---|
201 /* search closest frame rate */ | 201 /* search closest frame rate */ |
202 { | 202 { |
203 int i, dmin, d; | 203 int i, dmin, d; |
204 s->frame_rate_index = 0; | 204 s->frame_rate_index = 0; |
205 dmin = 0x7fffffff; | 205 dmin = 0x7fffffff; |
206 for(i=1;i<9;i++) { | 206 for(i=1;i<14;i++) { |
207 d = abs(s->frame_rate - frame_rate_tab[i]); | 207 if(s->avctx->strict_std_compliance >= 0 && i>=9) break; |
208 | |
209 d = abs(MPEG1_FRAME_RATE_BASE*(int64_t)s->avctx->frame_rate/s->avctx->frame_rate_base - frame_rate_tab[i]); | |
208 if (d < dmin) { | 210 if (d < dmin) { |
209 dmin = d; | 211 dmin = d; |
210 s->frame_rate_index = i; | 212 s->frame_rate_index = i; |
211 } | 213 } |
212 } | 214 } |
246 put_header(s, GOP_START_CODE); | 248 put_header(s, GOP_START_CODE); |
247 put_bits(&s->pb, 1, 0); /* do drop frame */ | 249 put_bits(&s->pb, 1, 0); /* do drop frame */ |
248 /* time code : we must convert from the real frame rate to a | 250 /* time code : we must convert from the real frame rate to a |
249 fake mpeg frame rate in case of low frame rate */ | 251 fake mpeg frame rate in case of low frame rate */ |
250 fps = frame_rate_tab[s->frame_rate_index]; | 252 fps = frame_rate_tab[s->frame_rate_index]; |
251 time_code = (int64_t)s->fake_picture_number * FRAME_RATE_BASE; | 253 time_code = (int64_t)s->fake_picture_number * MPEG1_FRAME_RATE_BASE; |
252 s->gop_picture_number = s->fake_picture_number; | 254 s->gop_picture_number = s->fake_picture_number; |
253 put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); | 255 put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); |
254 put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); | 256 put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); |
255 put_bits(&s->pb, 1, 1); | 257 put_bits(&s->pb, 1, 1); |
256 put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); | 258 put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); |
257 put_bits(&s->pb, 6, (uint32_t)((time_code % fps) / FRAME_RATE_BASE)); | 259 put_bits(&s->pb, 6, (uint32_t)((time_code % fps) / MPEG1_FRAME_RATE_BASE)); |
258 put_bits(&s->pb, 1, 1); /* closed gop */ | 260 put_bits(&s->pb, 1, 1); /* closed gop */ |
259 put_bits(&s->pb, 1, 0); /* broken link */ | 261 put_bits(&s->pb, 1, 0); /* broken link */ |
260 } | 262 } |
261 | 263 |
262 if (s->frame_rate < (24 * FRAME_RATE_BASE) && s->picture_number > 0) { | 264 if (s->avctx->frame_rate < (24 * s->avctx->frame_rate_base) && s->picture_number > 0) { |
263 /* insert empty P pictures to slow down to the desired | 265 /* insert empty P pictures to slow down to the desired |
264 frame rate. Each fake pictures takes about 20 bytes */ | 266 frame rate. Each fake pictures takes about 20 bytes */ |
265 fps = frame_rate_tab[s->frame_rate_index]; | 267 fps = frame_rate_tab[s->frame_rate_index]; |
266 n = (((int64_t)s->picture_number * fps) / s->frame_rate) - 1; | 268 n = av_rescale((int64_t)s->picture_number * s->avctx->frame_rate_base, fps, s->avctx->frame_rate) / MPEG1_FRAME_RATE_BASE - 1; |
267 while (s->fake_picture_number < n) { | 269 while (s->fake_picture_number < n) { |
268 mpeg1_skip_picture(s, s->fake_picture_number - | 270 mpeg1_skip_picture(s, s->fake_picture_number - |
269 s->gop_picture_number); | 271 s->gop_picture_number); |
270 s->fake_picture_number++; | 272 s->fake_picture_number++; |
271 } | 273 } |
1636 skip_bits1(&s->gb); /* marker */ | 1638 skip_bits1(&s->gb); /* marker */ |
1637 vbv_buf_ext = get_bits(&s->gb, 8); | 1639 vbv_buf_ext = get_bits(&s->gb, 8); |
1638 s->low_delay = get_bits1(&s->gb); | 1640 s->low_delay = get_bits1(&s->gb); |
1639 frame_rate_ext_n = get_bits(&s->gb, 2); | 1641 frame_rate_ext_n = get_bits(&s->gb, 2); |
1640 frame_rate_ext_d = get_bits(&s->gb, 5); | 1642 frame_rate_ext_d = get_bits(&s->gb, 5); |
1641 if (frame_rate_ext_d >= 1) | 1643 av_reduce( |
1642 s->frame_rate = (s->frame_rate * frame_rate_ext_n) / frame_rate_ext_d; | 1644 &s->avctx->frame_rate, |
1645 &s->avctx->frame_rate_base, | |
1646 frame_rate_tab[s->frame_rate_index] * (frame_rate_ext_n+1), | |
1647 MPEG1_FRAME_RATE_BASE * (frame_rate_ext_d+1), | |
1648 1<<30); | |
1649 | |
1643 dprintf("sequence extension\n"); | 1650 dprintf("sequence extension\n"); |
1644 s->mpeg2 = 1; | 1651 s->mpeg2 = 1; |
1645 s->avctx->sub_id = 2; /* indicates mpeg2 found */ | 1652 s->avctx->sub_id = 2; /* indicates mpeg2 found */ |
1646 | 1653 |
1647 aspect= mpeg2_aspect[s->aspect_ratio_info]; | 1654 aspect= mpeg2_aspect[s->aspect_ratio_info]; |
1988 s->height = height; | 1995 s->height = height; |
1989 avctx->has_b_frames= 1; | 1996 avctx->has_b_frames= 1; |
1990 s->avctx = avctx; | 1997 s->avctx = avctx; |
1991 avctx->width = width; | 1998 avctx->width = width; |
1992 avctx->height = height; | 1999 avctx->height = height; |
1993 if (s->frame_rate_index >= 9) { | 2000 av_reduce( |
1994 /* at least give a valid frame rate (some old mpeg1 have this) */ | 2001 &avctx->frame_rate, |
1995 avctx->frame_rate = 25 * FRAME_RATE_BASE; | 2002 &avctx->frame_rate_base, |
1996 } else { | 2003 frame_rate_tab[s->frame_rate_index], |
1997 avctx->frame_rate = frame_rate_tab[s->frame_rate_index]; | 2004 MPEG1_FRAME_RATE_BASE, //FIXME store in allready reduced form |
1998 } | 2005 1<<30 |
1999 s->frame_rate = avctx->frame_rate; | 2006 ); |
2000 avctx->bit_rate = s->bit_rate; | 2007 avctx->bit_rate = s->bit_rate; |
2001 | 2008 |
2002 if (MPV_common_init(s) < 0) | 2009 if (MPV_common_init(s) < 0) |
2003 return -1; | 2010 return -1; |
2004 s1->mpeg_enc_ctx_allocated = 1; | 2011 s1->mpeg_enc_ctx_allocated = 1; |