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;