summaryrefslogtreecommitdiffstats
path: root/libhb/decmpeg2.c
diff options
context:
space:
mode:
authorvan <[email protected]>2008-04-02 17:55:48 +0000
committervan <[email protected]>2008-04-02 17:55:48 +0000
commit7d87a5afd0a6764e9ef041053ba56234480aef81 (patch)
tree250e7f1e90a43b1fd2173f133281d81a2d34f7e2 /libhb/decmpeg2.c
parentf960fc7344f13893175b062bffc0877634aacceb (diff)
scan and pcm audio fixes.
- lpcm audio fixed to handle 24 bit & interpret header correctly. - get aspect ratio from libmpeg2 rather than doing it ourselves. - announce when aspect ratio changes during preview scan. - if aspect ratio isn't either 4:3 or 16:9 complain & map to either 4:3 or 16:9 (whichever is closest). - start stream previews from file position 0 rather than 1/11 in case there's only on mpeg sequence header in the file. - don't give up on a file just because we can't get a preview due to a missing sequence header - only give up if we can't get any previews. - get audio bitstream characteristics during preview in a uniform way (we were treating PCM & MPEG audio specially which resulted in not getting their sample rate which caused a divide by zero in sync). git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@1370 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/decmpeg2.c')
-rw-r--r--libhb/decmpeg2.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/libhb/decmpeg2.c b/libhb/decmpeg2.c
index 576b04591..4f0c27ddd 100644
--- a/libhb/decmpeg2.c
+++ b/libhb/decmpeg2.c
@@ -100,28 +100,21 @@ int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es,
m->width = m->info->sequence->width;
m->height = m->info->sequence->height;
m->rate = m->info->sequence->frame_period;
- }
- if ( m->aspect_ratio <= 0 )
- {
- // We can parse out the aspect ratio from the Sequence Start Header data in buf_es->data
-
- // Make sure we have the correct data in the buffer
- if ((buf_es->data[0] == 0x00) && (buf_es->data[1] == 0x00) && (buf_es->data[2] == 0x01) && (buf_es->data[3] == 0xb3))
- {
- unsigned char ar_fr = buf_es->data[7]; // Top 4 bits == aspect ratio flag - bottom 4 bits == rate flags
- switch ((ar_fr & 0xf0) >> 4)
+ if ( m->aspect_ratio <= 0 && m->height &&
+ m->info->sequence->pixel_height )
{
- case 2:
- m->aspect_ratio = HB_ASPECT_BASE * 4 / 3; // 4:3
- break;
- case 3:
- m->aspect_ratio = HB_ASPECT_BASE * 16 / 9; // 16:9
- break;
- default:
- hb_log("hb_libmpeg2_decode - STATE_SEQUENCE unexpected aspect ratio/frame rate 0x%x\n", ar_fr);
- break;
+ /* mpeg2_parse doesn't store the aspect ratio. Instead
+ * it keeps the pixel width & height that would cause
+ * the storage width & height to come out in the correct
+ * aspect ratio. Convert these back to aspect ratio.
+ * We do the calc in floating point to get the rounding right.
+ * We round in the second decimal digit because we scale
+ * the (integer) aspect by 9 to preserve the 1st digit.
+ */
+ double ar_numer = m->width * m->info->sequence->pixel_width;
+ double ar_denom = m->height * m->info->sequence->pixel_height;
+ m->aspect_ratio = ( ar_numer / ar_denom + .05 ) * HB_ASPECT_BASE;
}
- }
}
}
else if( state == STATE_GOP && m->look_for_break == 2)