X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpeg12enc.c;h=eb07ecfc5ee72893bef4f956e1d03eceed9a351c;hb=d7537a6fce140876405a66f059f14e190527388d;hp=8afaf0a6d0ca62a07e822c6c26329198ec83cbba;hpb=a6bc573158514ebf70c32e6ffff43074d93cbcce;p=ffmpeg diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 8afaf0a6d0c..eb07ecfc5ee 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -1,27 +1,27 @@ /* * MPEG1/2 encoder - * Copyright (c) 2000,2001 Fabrice Bellard. + * Copyright (c) 2000,2001 Fabrice Bellard * Copyright (c) 2002-2004 Michael Niedermayer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** - * @file mpeg12enc.c + * @file * MPEG1/2 encoder */ @@ -119,7 +119,7 @@ static int find_frame_rate_index(MpegEncContext *s){ for(i=1;i<14;i++) { int64_t n0= 1001LL/ff_frame_rate_tab[i].den*ff_frame_rate_tab[i].num*s->avctx->time_base.num; int64_t n1= 1001LL*s->avctx->time_base.den; - if(s->avctx->strict_std_compliance > FF_COMPLIANCE_INOFFICIAL && i>=9) break; + if(s->avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL && i>=9) break; d = FFABS(n0 - n1); if(d < dmin){ @@ -133,7 +133,7 @@ static int find_frame_rate_index(MpegEncContext *s){ return 0; } -static int encode_init(AVCodecContext *avctx) +static av_cold int encode_init(AVCodecContext *avctx) { MpegEncContext *s = avctx->priv_data; @@ -184,7 +184,7 @@ static void put_header(MpegEncContext *s, int header) { align_put_bits(&s->pb); put_bits(&s->pb, 16, header>>16); - put_bits(&s->pb, 16, header&0xFFFF); + put_sbits(&s->pb, 16, header); } /* put sequence header if needed */ @@ -206,15 +206,15 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) /* mpeg1 header repeated every gop */ put_header(s, SEQ_START_CODE); - put_bits(&s->pb, 12, s->width); - put_bits(&s->pb, 12, s->height); + put_sbits(&s->pb, 12, s->width ); + put_sbits(&s->pb, 12, s->height); for(i=1; i<15; i++){ float error= aspect_ratio; if(s->codec_id == CODEC_ID_MPEG1VIDEO || i <=1) - error-= 1.0/mpeg1_aspect[i]; + error-= 1.0/ff_mpeg1_aspect[i]; else - error-= av_q2d(mpeg2_aspect[i])*s->height/s->width; + error-= av_q2d(ff_mpeg2_aspect[i])*s->height/s->width; error= FFABS(error); @@ -242,9 +242,9 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) vbv_buffer_size = (( 20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; vbv_buffer_size= (vbv_buffer_size + 16383) / 16384; - put_bits(&s->pb, 18, v & 0x3FFFF); + put_sbits(&s->pb, 18, v); put_bits(&s->pb, 1, 1); /* marker */ - put_bits(&s->pb, 10, vbv_buffer_size & 0x3FF); + put_sbits(&s->pb, 10, vbv_buffer_size); constraint_parameter_flag= s->width <= 768 && s->height <= 576 && @@ -272,8 +272,8 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) put_bits(&s->pb, 1, s->progressive_sequence); put_bits(&s->pb, 2, s->chroma_format); - put_bits(&s->pb, 2, 0); //horizontal size ext - put_bits(&s->pb, 2, 0); //vertical size ext + put_bits(&s->pb, 2, s->width >>12); + put_bits(&s->pb, 2, s->height>>12); put_bits(&s->pb, 12, v>>18); //bitrate ext put_bits(&s->pb, 1, 1); //marker put_bits(&s->pb, 8, vbv_buffer_size >>10); //vbv buffer ext @@ -312,8 +312,8 @@ static inline void encode_mb_skip_run(MpegEncContext *s, int run){ put_bits(&s->pb, 11, 0x008); run -= 33; } - put_bits(&s->pb, mbAddrIncrTable[run][1], - mbAddrIncrTable[run][0]); + put_bits(&s->pb, ff_mpeg12_mbAddrIncrTable[run][1], + ff_mpeg12_mbAddrIncrTable[run][0]); } static av_always_inline void put_qscale(MpegEncContext *s) @@ -327,7 +327,12 @@ static av_always_inline void put_qscale(MpegEncContext *s) } void ff_mpeg1_encode_slice_header(MpegEncContext *s){ - put_header(s, SLICE_MIN_START_CODE + s->mb_y); + if (s->height > 2800) { + put_header(s, SLICE_MIN_START_CODE + (s->mb_y & 127)); + put_bits(&s->pb, 3, s->mb_y >> 7); /* slice_vertical_position_extension */ + } else { + put_header(s, SLICE_MIN_START_CODE + s->mb_y); + } put_qscale(s); put_bits(&s->pb, 1, 0); /* slice extra information */ } @@ -349,7 +354,7 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) put_bits(&s->pb, 16, 0xFFFF); /* vbv_delay */ // RAL: Forward f_code also needed for B frames - if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { + if (s->pict_type == AV_PICTURE_TYPE_P || s->pict_type == AV_PICTURE_TYPE_B) { put_bits(&s->pb, 1, 0); /* half pel coordinates */ if(s->codec_id == CODEC_ID_MPEG1VIDEO) put_bits(&s->pb, 3, s->f_code); /* forward_f_code */ @@ -358,7 +363,7 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) } // RAL: Backward f_code necessary for B frames - if (s->pict_type == B_TYPE) { + if (s->pict_type == AV_PICTURE_TYPE_B) { put_bits(&s->pb, 1, 0); /* half pel coordinates */ if(s->codec_id == CODEC_ID_MPEG1VIDEO) put_bits(&s->pb, 3, s->b_code); /* backward_f_code */ @@ -372,13 +377,13 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) if(s->codec_id == CODEC_ID_MPEG2VIDEO){ put_header(s, EXT_START_CODE); put_bits(&s->pb, 4, 8); //pic ext - if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { + if (s->pict_type == AV_PICTURE_TYPE_P || s->pict_type == AV_PICTURE_TYPE_B) { put_bits(&s->pb, 4, s->f_code); put_bits(&s->pb, 4, s->f_code); }else{ put_bits(&s->pb, 8, 255); } - if (s->pict_type == B_TYPE) { + if (s->pict_type == AV_PICTURE_TYPE_B) { put_bits(&s->pb, 4, s->b_code); put_bits(&s->pb, 4, s->b_code); }else{ @@ -451,15 +456,15 @@ static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, if (cbp == 0 && !first_mb && s->mv_type == MV_TYPE_16X16 && (mb_x != s->mb_width - 1 || (mb_y != s->mb_height - 1 && s->codec_id == CODEC_ID_MPEG1VIDEO)) && - ((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) || - (s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | + ((s->pict_type == AV_PICTURE_TYPE_P && (motion_x | motion_y) == 0) || + (s->pict_type == AV_PICTURE_TYPE_B && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | ((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) { s->mb_skip_run++; s->qscale -= s->dquant; s->skip_count++; s->misc_bits++; s->last_bits++; - if(s->pict_type == P_TYPE){ + if(s->pict_type == AV_PICTURE_TYPE_P){ s->last_mv[0][1][0]= s->last_mv[0][0][0]= s->last_mv[0][1][1]= s->last_mv[0][0][1]= 0; } @@ -471,7 +476,7 @@ static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, encode_mb_skip_run(s, s->mb_skip_run); } - if (s->pict_type == I_TYPE) { + if (s->pict_type == AV_PICTURE_TYPE_I) { if(s->dquant && cbp){ put_mb_modes(s, 2, 1, 0, 0); /* macroblock_type : macroblock_quant = 1 */ put_qscale(s); @@ -492,7 +497,7 @@ static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, s->misc_bits+= get_bits_diff(s); s->i_count++; memset(s->last_mv, 0, sizeof(s->last_mv)); - } else if (s->pict_type == P_TYPE) { + } else if (s->pict_type == AV_PICTURE_TYPE_P) { if(s->mv_type == MV_TYPE_16X16){ if (cbp != 0) { if ((motion_x|motion_y) == 0) { @@ -554,29 +559,27 @@ static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, } if(cbp) { if (s->chroma_y_shift) { - put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]); + put_bits(&s->pb, ff_mpeg12_mbPatTable[cbp][1], ff_mpeg12_mbPatTable[cbp][0]); } else { - put_bits(&s->pb, mbPatTable[cbp>>2][1], mbPatTable[cbp>>2][0]); - put_bits(&s->pb, 2, cbp & 3); + put_bits(&s->pb, ff_mpeg12_mbPatTable[cbp>>2][1], ff_mpeg12_mbPatTable[cbp>>2][0]); + put_sbits(&s->pb, 2, cbp); } } s->f_count++; } else{ - static const int mb_type_len[4]={0,3,4,2}; //bak,for,bi - if(s->mv_type == MV_TYPE_16X16){ if (cbp){ // With coded bloc pattern if (s->dquant) { if(s->mv_dir == MV_DIR_FORWARD) put_mb_modes(s, 6, 3, 1, 0); else - put_mb_modes(s, mb_type_len[s->mv_dir]+3, 2, 1, 0); + put_mb_modes(s, 8-s->mv_dir, 2, 1, 0); put_qscale(s); } else { - put_mb_modes(s, mb_type_len[s->mv_dir], 3, 1, 0); + put_mb_modes(s, 5-s->mv_dir, 3, 1, 0); } }else{ // No coded bloc pattern - put_bits(&s->pb, mb_type_len[s->mv_dir], 2); + put_bits(&s->pb, 5-s->mv_dir, 2); if (!s->frame_pred_frame_dct) put_bits(&s->pb, 2, 2); /* motion_type: frame */ s->qscale -= s->dquant; @@ -604,13 +607,13 @@ static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, if(s->mv_dir == MV_DIR_FORWARD) put_mb_modes(s, 6, 3, 1, 1); else - put_mb_modes(s, mb_type_len[s->mv_dir]+3, 2, 1, 1); + put_mb_modes(s, 8-s->mv_dir, 2, 1, 1); put_qscale(s); } else { - put_mb_modes(s, mb_type_len[s->mv_dir], 3, 1, 1); + put_mb_modes(s, 5-s->mv_dir, 3, 1, 1); } }else{ // No coded bloc pattern - put_bits(&s->pb, mb_type_len[s->mv_dir], 2); + put_bits(&s->pb, 5-s->mv_dir, 2); put_bits(&s->pb, 2, 1); /* motion_type: field */ s->qscale -= s->dquant; } @@ -639,10 +642,10 @@ static av_always_inline void mpeg1_encode_mb_internal(MpegEncContext *s, s->mv_bits += get_bits_diff(s); if(cbp) { if (s->chroma_y_shift) { - put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]); + put_bits(&s->pb, ff_mpeg12_mbPatTable[cbp][1], ff_mpeg12_mbPatTable[cbp][0]); } else { - put_bits(&s->pb, mbPatTable[cbp>>2][1], mbPatTable[cbp>>2][0]); - put_bits(&s->pb, 2, cbp & 3); + put_bits(&s->pb, ff_mpeg12_mbPatTable[cbp>>2][1], ff_mpeg12_mbPatTable[cbp>>2][0]); + put_sbits(&s->pb, 2, cbp); } } } @@ -668,19 +671,17 @@ void mpeg1_encode_mb(MpegEncContext *s, DCTELEM block[6][64], int motion_x, int // RAL: Parameter added: f_or_b_code static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) { - int code, bit_size, l, bits, range, sign; - if (val == 0) { /* zero vector */ - code = 0; put_bits(&s->pb, - mbMotionVectorTable[0][1], - mbMotionVectorTable[0][0]); + ff_mpeg12_mbMotionVectorTable[0][1], + ff_mpeg12_mbMotionVectorTable[0][0]); } else { - bit_size = f_or_b_code - 1; - range = 1 << bit_size; + int code, sign, bits; + int bit_size = f_or_b_code - 1; + int range = 1 << bit_size; /* modulo encoding */ - l= INT_BIT - 5 - bit_size; + int l= INT_BIT - 5 - bit_size; val= (val<>l; if (val >= 0) { @@ -699,8 +700,8 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) assert(code > 0 && code <= 16); put_bits(&s->pb, - mbMotionVectorTable[code][1], - mbMotionVectorTable[code][0]); + ff_mpeg12_mbMotionVectorTable[code][1], + ff_mpeg12_mbMotionVectorTable[code][0]); put_bits(&s->pb, 1, sign); if (bit_size > 0) { @@ -713,7 +714,7 @@ void ff_mpeg1_encode_init(MpegEncContext *s) { static int done=0; - common_init(s); + ff_mpeg12_common_init(s); if(!done){ int f_code; @@ -721,18 +722,18 @@ void ff_mpeg1_encode_init(MpegEncContext *s) int i; done=1; - init_rl(&rl_mpeg1, static_rl_table_store[0]); - init_rl(&rl_mpeg2, static_rl_table_store[1]); + init_rl(&ff_rl_mpeg1, ff_mpeg12_static_rl_table_store[0]); + init_rl(&ff_rl_mpeg2, ff_mpeg12_static_rl_table_store[1]); for(i=0; i<64; i++) { - mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i]; - mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i]; + mpeg1_max_level[0][i]= ff_rl_mpeg1.max_level[0][i]; + mpeg1_index_run[0][i]= ff_rl_mpeg1.index_run[0][i]; } - init_uni_ac_vlc(&rl_mpeg1, uni_mpeg1_ac_vlc_len); + init_uni_ac_vlc(&ff_rl_mpeg1, uni_mpeg1_ac_vlc_len); if(s->intra_vlc_format) - init_uni_ac_vlc(&rl_mpeg2, uni_mpeg2_ac_vlc_len); + init_uni_ac_vlc(&ff_rl_mpeg2, uni_mpeg2_ac_vlc_len); /* build unified dc encoding tables */ for(i=-255; i<256; i++) @@ -745,12 +746,12 @@ void ff_mpeg1_encode_init(MpegEncContext *s) if(diff<0) diff--; index = av_log2(2*adiff); - bits= vlc_dc_lum_bits[index] + index; - code= (vlc_dc_lum_code[index]<> bit_size) + 1; if(code<17){ - len= mbMotionVectorTable[code][1] + 1 + bit_size; + len= ff_mpeg12_mbMotionVectorTable[code][1] + 1 + bit_size; }else{ - len= mbMotionVectorTable[16][1] + 2 + bit_size; + len= ff_mpeg12_mbMotionVectorTable[16][1] + 2 + bit_size; } } @@ -822,13 +822,13 @@ static inline void encode_dc(MpegEncContext *s, int diff, int component) if (component == 0) { put_bits( &s->pb, - vlc_dc_lum_bits[index] + index, - (vlc_dc_lum_code[index]<pb, - vlc_dc_chroma_bits[index] + index, - (vlc_dc_chroma_code[index]<block_last_index[n]; @@ -864,7 +864,7 @@ static void mpeg1_encode_block(MpegEncContext *s, s->last_dc[component] = dc; i = 1; if (s->intra_vlc_format) - table_vlc = rl_mpeg2.table_vlc; + table_vlc = ff_rl_mpeg2.table_vlc; } else { /* encode the first coefficient : needs to be done here because it is handled slightly differently */ @@ -887,10 +887,6 @@ static void mpeg1_encode_block(MpegEncContext *s, j = s->intra_scantable.permutated[i]; level = block[j]; next_coef: -#if 0 - if (level != 0) - dprintf(s->avctx, "level[%d]=%d\n", i, level); -#endif /* encode using VLC */ if (level != 0) { run = i - last_non_zero - 1; @@ -910,16 +906,16 @@ static void mpeg1_encode_block(MpegEncContext *s, put_bits(&s->pb, 6, run); if(s->codec_id == CODEC_ID_MPEG1VIDEO){ if (alevel < 128) { - put_bits(&s->pb, 8, level & 0xff); + put_sbits(&s->pb, 8, level); } else { if (level < 0) { put_bits(&s->pb, 16, 0x8001 + level + 255); } else { - put_bits(&s->pb, 16, level & 0xffff); + put_sbits(&s->pb, 16, level); } } }else{ - put_bits(&s->pb, 12, level & 0xfff); + put_sbits(&s->pb, 12, level); } } last_non_zero = i; @@ -929,28 +925,30 @@ static void mpeg1_encode_block(MpegEncContext *s, put_bits(&s->pb, table_vlc[112][1], table_vlc[112][0]); } -AVCodec mpeg1video_encoder = { +AVCodec ff_mpeg1video_encoder = { "mpeg1video", - CODEC_TYPE_VIDEO, + AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, sizeof(MpegEncContext), encode_init, MPV_encode_picture, MPV_encode_end, .supported_framerates= ff_frame_rate_tab+1, - .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1}, - .capabilities= CODEC_CAP_DELAY, + .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, + .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, + .long_name= NULL_IF_CONFIG_SMALL("MPEG-1 video"), }; -AVCodec mpeg2video_encoder = { +AVCodec ff_mpeg2video_encoder = { "mpeg2video", - CODEC_TYPE_VIDEO, + AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG2VIDEO, sizeof(MpegEncContext), encode_init, MPV_encode_picture, MPV_encode_end, .supported_framerates= ff_frame_rate_tab+1, - .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, -1}, - .capabilities= CODEC_CAP_DELAY, + .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE}, + .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS, + .long_name= NULL_IF_CONFIG_SMALL("MPEG-2 video"), };