Libav 0.7.1
|
00001 /* 00002 * Copyright (c) 2002 The Libav Project 00003 * 00004 * This file is part of Libav. 00005 * 00006 * Libav is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * Libav is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with Libav; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00019 */ 00020 00021 #include "avcodec.h" 00022 #include "dsputil.h" 00023 #include "mpegvideo.h" 00024 #include "msmpeg4.h" 00025 #include "msmpeg4data.h" 00026 #include "h263.h" 00027 #include "wmv2.h" 00028 00029 00030 static int encode_ext_header(Wmv2Context *w){ 00031 MpegEncContext * const s= &w->s; 00032 PutBitContext pb; 00033 int code; 00034 00035 init_put_bits(&pb, s->avctx->extradata, s->avctx->extradata_size); 00036 00037 put_bits(&pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29 00038 put_bits(&pb, 11, FFMIN(s->bit_rate/1024, 2047)); 00039 00040 put_bits(&pb, 1, w->mspel_bit=1); 00041 put_bits(&pb, 1, s->loop_filter); 00042 put_bits(&pb, 1, w->abt_flag=1); 00043 put_bits(&pb, 1, w->j_type_bit=1); 00044 put_bits(&pb, 1, w->top_left_mv_flag=0); 00045 put_bits(&pb, 1, w->per_mb_rl_bit=1); 00046 put_bits(&pb, 3, code=1); 00047 00048 flush_put_bits(&pb); 00049 00050 s->slice_height = s->mb_height / code; 00051 00052 return 0; 00053 } 00054 00055 static av_cold int wmv2_encode_init(AVCodecContext *avctx){ 00056 Wmv2Context * const w= avctx->priv_data; 00057 00058 if(MPV_encode_init(avctx) < 0) 00059 return -1; 00060 00061 ff_wmv2_common_init(w); 00062 00063 avctx->extradata_size= 4; 00064 avctx->extradata= av_mallocz(avctx->extradata_size + 10); 00065 encode_ext_header(w); 00066 00067 return 0; 00068 } 00069 00070 int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) 00071 { 00072 Wmv2Context * const w= (Wmv2Context*)s; 00073 00074 put_bits(&s->pb, 1, s->pict_type - 1); 00075 if(s->pict_type == AV_PICTURE_TYPE_I){ 00076 put_bits(&s->pb, 7, 0); 00077 } 00078 put_bits(&s->pb, 5, s->qscale); 00079 00080 s->dc_table_index = 1; 00081 s->mv_table_index = 1; /* only if P frame */ 00082 s->per_mb_rl_table = 0; 00083 s->mspel= 0; 00084 w->per_mb_abt=0; 00085 w->abt_type=0; 00086 w->j_type=0; 00087 00088 assert(s->flipflop_rounding); 00089 00090 if (s->pict_type == AV_PICTURE_TYPE_I) { 00091 assert(s->no_rounding==1); 00092 if(w->j_type_bit) put_bits(&s->pb, 1, w->j_type); 00093 00094 if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); 00095 00096 if(!s->per_mb_rl_table){ 00097 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); 00098 ff_msmpeg4_code012(&s->pb, s->rl_table_index); 00099 } 00100 00101 put_bits(&s->pb, 1, s->dc_table_index); 00102 00103 s->inter_intra_pred= 0; 00104 }else{ 00105 int cbp_index; 00106 00107 put_bits(&s->pb, 2, SKIP_TYPE_NONE); 00108 00109 ff_msmpeg4_code012(&s->pb, cbp_index=0); 00110 if(s->qscale <= 10){ 00111 int map[3]= {0,2,1}; 00112 w->cbp_table_index= map[cbp_index]; 00113 }else if(s->qscale <= 20){ 00114 int map[3]= {1,0,2}; 00115 w->cbp_table_index= map[cbp_index]; 00116 }else{ 00117 int map[3]= {2,1,0}; 00118 w->cbp_table_index= map[cbp_index]; 00119 } 00120 00121 if(w->mspel_bit) put_bits(&s->pb, 1, s->mspel); 00122 00123 if(w->abt_flag){ 00124 put_bits(&s->pb, 1, w->per_mb_abt^1); 00125 if(!w->per_mb_abt){ 00126 ff_msmpeg4_code012(&s->pb, w->abt_type); 00127 } 00128 } 00129 00130 if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); 00131 00132 if(!s->per_mb_rl_table){ 00133 ff_msmpeg4_code012(&s->pb, s->rl_table_index); 00134 s->rl_chroma_table_index = s->rl_table_index; 00135 } 00136 put_bits(&s->pb, 1, s->dc_table_index); 00137 put_bits(&s->pb, 1, s->mv_table_index); 00138 00139 s->inter_intra_pred= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); 00140 } 00141 s->esc3_level_length= 0; 00142 s->esc3_run_length= 0; 00143 00144 return 0; 00145 } 00146 00147 /* Nearly identical to wmv1 but that is just because we do not use the 00148 * useless M$ crap features. It is duplicated here in case someone wants 00149 * to add support for these crap features. */ 00150 void ff_wmv2_encode_mb(MpegEncContext * s, 00151 DCTELEM block[6][64], 00152 int motion_x, int motion_y) 00153 { 00154 Wmv2Context * const w= (Wmv2Context*)s; 00155 int cbp, coded_cbp, i; 00156 int pred_x, pred_y; 00157 uint8_t *coded_block; 00158 00159 ff_msmpeg4_handle_slices(s); 00160 00161 if (!s->mb_intra) { 00162 /* compute cbp */ 00163 cbp = 0; 00164 for (i = 0; i < 6; i++) { 00165 if (s->block_last_index[i] >= 0) 00166 cbp |= 1 << (5 - i); 00167 } 00168 00169 put_bits(&s->pb, 00170 wmv2_inter_table[w->cbp_table_index][cbp + 64][1], 00171 wmv2_inter_table[w->cbp_table_index][cbp + 64][0]); 00172 00173 /* motion vector */ 00174 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); 00175 ff_msmpeg4_encode_motion(s, motion_x - pred_x, 00176 motion_y - pred_y); 00177 } else { 00178 /* compute cbp */ 00179 cbp = 0; 00180 coded_cbp = 0; 00181 for (i = 0; i < 6; i++) { 00182 int val, pred; 00183 val = (s->block_last_index[i] >= 1); 00184 cbp |= val << (5 - i); 00185 if (i < 4) { 00186 /* predict value for close blocks only for luma */ 00187 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); 00188 *coded_block = val; 00189 val = val ^ pred; 00190 } 00191 coded_cbp |= val << (5 - i); 00192 } 00193 00194 if (s->pict_type == AV_PICTURE_TYPE_I) { 00195 put_bits(&s->pb, 00196 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); 00197 } else { 00198 put_bits(&s->pb, 00199 wmv2_inter_table[w->cbp_table_index][cbp][1], 00200 wmv2_inter_table[w->cbp_table_index][cbp][0]); 00201 } 00202 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ 00203 if(s->inter_intra_pred){ 00204 s->h263_aic_dir=0; 00205 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]); 00206 } 00207 } 00208 00209 for (i = 0; i < 6; i++) { 00210 ff_msmpeg4_encode_block(s, block[i], i); 00211 } 00212 } 00213 00214 AVCodec ff_wmv2_encoder = { 00215 "wmv2", 00216 AVMEDIA_TYPE_VIDEO, 00217 CODEC_ID_WMV2, 00218 sizeof(Wmv2Context), 00219 wmv2_encode_init, 00220 MPV_encode_picture, 00221 MPV_encode_end, 00222 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE}, 00223 .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 8"), 00224 };