Commit 92dff8bf authored by michaelni's avatar michaelni

mpeg1&2 aspect decoding


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@1318 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent b03ee312
...@@ -1431,8 +1431,9 @@ static int mpeg1_decode_picture(AVCodecContext *avctx, ...@@ -1431,8 +1431,9 @@ static int mpeg1_decode_picture(AVCodecContext *avctx,
static void mpeg_decode_sequence_extension(MpegEncContext *s) static void mpeg_decode_sequence_extension(MpegEncContext *s)
{ {
int horiz_size_ext, vert_size_ext; int horiz_size_ext, vert_size_ext;
int bit_rate_ext, vbv_buf_ext, low_delay; int bit_rate_ext, vbv_buf_ext;
int frame_rate_ext_n, frame_rate_ext_d; int frame_rate_ext_n, frame_rate_ext_d;
float aspect;
skip_bits(&s->gb, 8); /* profil and level */ skip_bits(&s->gb, 8); /* profil and level */
s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */
...@@ -1445,7 +1446,7 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) ...@@ -1445,7 +1446,7 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s)
s->bit_rate = ((s->bit_rate / 400) | (bit_rate_ext << 12)) * 400; s->bit_rate = ((s->bit_rate / 400) | (bit_rate_ext << 12)) * 400;
skip_bits1(&s->gb); /* marker */ skip_bits1(&s->gb); /* marker */
vbv_buf_ext = get_bits(&s->gb, 8); vbv_buf_ext = get_bits(&s->gb, 8);
low_delay = get_bits1(&s->gb); s->low_delay = get_bits1(&s->gb);
frame_rate_ext_n = get_bits(&s->gb, 2); frame_rate_ext_n = get_bits(&s->gb, 2);
frame_rate_ext_d = get_bits(&s->gb, 5); frame_rate_ext_d = get_bits(&s->gb, 5);
if (frame_rate_ext_d >= 1) if (frame_rate_ext_d >= 1)
...@@ -1453,6 +1454,10 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) ...@@ -1453,6 +1454,10 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s)
dprintf("sequence extension\n"); dprintf("sequence extension\n");
s->mpeg2 = 1; s->mpeg2 = 1;
s->avctx->sub_id = 2; /* indicates mpeg2 found */ s->avctx->sub_id = 2; /* indicates mpeg2 found */
aspect= mpeg2_aspect[s->aspect_ratio_info];
if(aspect>0.0) s->avctx->aspect_ratio= s->width/(aspect*s->height);
else if(aspect<0.0) s->avctx->aspect_ratio= -1.0/aspect;
} }
static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) static void mpeg_decode_quant_matrix_extension(MpegEncContext *s)
...@@ -1706,12 +1711,18 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, ...@@ -1706,12 +1711,18 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
Mpeg1Context *s1 = avctx->priv_data; Mpeg1Context *s1 = avctx->priv_data;
MpegEncContext *s = &s1->mpeg_enc_ctx; MpegEncContext *s = &s1->mpeg_enc_ctx;
int width, height, i, v, j; int width, height, i, v, j;
float aspect;
init_get_bits(&s->gb, buf, buf_size); init_get_bits(&s->gb, buf, buf_size);
width = get_bits(&s->gb, 12); width = get_bits(&s->gb, 12);
height = get_bits(&s->gb, 12); height = get_bits(&s->gb, 12);
skip_bits(&s->gb, 4); s->aspect_ratio_info= get_bits(&s->gb, 4);
if(!s->mpeg2){
aspect= mpeg1_aspect[s->aspect_ratio_info];
if(aspect!=0.0) avctx->aspect_ratio= width/(aspect*height);
}
s->frame_rate_index = get_bits(&s->gb, 4); s->frame_rate_index = get_bits(&s->gb, 4);
if (s->frame_rate_index == 0) if (s->frame_rate_index == 0)
return -1; return -1;
...@@ -1896,15 +1907,16 @@ static int mpeg_decode_frame(AVCodecContext *avctx, ...@@ -1896,15 +1907,16 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
s->buffer, input_size); s->buffer, input_size);
break; break;
default: default:
/* skip b frames if we dont have reference frames */
if(s2->last_picture.data[0]==NULL && s2->pict_type==B_TYPE) break;
/* skip b frames if we are in a hurry */
if(avctx->hurry_up && s2->pict_type==B_TYPE) break;
/* skip everything if we are in a hurry>=5 */
if(avctx->hurry_up>=5) break;
if (start_code >= SLICE_MIN_START_CODE && if (start_code >= SLICE_MIN_START_CODE &&
start_code <= SLICE_MAX_START_CODE) { start_code <= SLICE_MAX_START_CODE) {
/* skip b frames if we dont have reference frames */
if(s2->last_picture.data[0]==NULL && s2->pict_type==B_TYPE) break;
/* skip b frames if we are in a hurry */
if(avctx->hurry_up && s2->pict_type==B_TYPE) break;
/* skip everything if we are in a hurry>=5 */
if(avctx->hurry_up>=5) break;
ret = mpeg_decode_slice(avctx, picture, ret = mpeg_decode_slice(avctx, picture,
start_code, s->buffer, input_size); start_code, s->buffer, input_size);
if (ret == DECODE_SLICE_EOP) { if (ret == DECODE_SLICE_EOP) {
......
...@@ -411,4 +411,32 @@ UINT8 ff_mpeg1_dc_scale_table[128]={ // MN: mpeg2 really can have such large qsc ...@@ -411,4 +411,32 @@ UINT8 ff_mpeg1_dc_scale_table[128]={ // MN: mpeg2 really can have such large qsc
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
}; };
static const float mpeg1_aspect[16]={
0.0000,
1.0000,
0.6735,
0.7031,
0.7615,
0.8055,
0.8437,
0.8935,
0.9157,
0.9815,
1.0255,
1.0695,
1.0950,
1.1575,
1.2015,
};
static const float mpeg2_aspect[16]={
0,
1.0,
-3.0/4.0,
-9.0/16.0,
-1.0/2.21,
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment