1/* 2 * Copyright (c) 2002 The FFmpeg Project 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#include "avcodec.h" 22#include "mpegvideo.h" 23#include "msmpeg4.h" 24#include "msmpeg4data.h" 25#include "h263.h" 26#include "wmv2.h" 27 28 29static int encode_ext_header(Wmv2Context *w){ 30 MpegEncContext * const s= &w->s; 31 PutBitContext pb; 32 int code; 33 34 init_put_bits(&pb, s->avctx->extradata, s->avctx->extradata_size); 35 36 put_bits(&pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29 37 put_bits(&pb, 11, FFMIN(s->bit_rate/1024, 2047)); 38 39 put_bits(&pb, 1, w->mspel_bit=1); 40 put_bits(&pb, 1, s->loop_filter); 41 put_bits(&pb, 1, w->abt_flag=1); 42 put_bits(&pb, 1, w->j_type_bit=1); 43 put_bits(&pb, 1, w->top_left_mv_flag=0); 44 put_bits(&pb, 1, w->per_mb_rl_bit=1); 45 put_bits(&pb, 3, code=1); 46 47 flush_put_bits(&pb); 48 49 s->slice_height = s->mb_height / code; 50 51 return 0; 52} 53 54static av_cold int wmv2_encode_init(AVCodecContext *avctx){ 55 Wmv2Context * const w= avctx->priv_data; 56 57 if(ff_MPV_encode_init(avctx) < 0) 58 return -1; 59 60 ff_wmv2_common_init(w); 61 62 avctx->extradata_size= 4; 63 avctx->extradata= av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); 64 if (!avctx->extradata) 65 return AVERROR(ENOMEM); 66 encode_ext_header(w); 67 68 return 0; 69} 70 71int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number) 72{ 73 Wmv2Context * const w= (Wmv2Context*)s; 74 75 put_bits(&s->pb, 1, s->pict_type - 1); 76 if(s->pict_type == AV_PICTURE_TYPE_I){ 77 put_bits(&s->pb, 7, 0); 78 } 79 put_bits(&s->pb, 5, s->qscale); 80 81 s->dc_table_index = 1; 82 s->mv_table_index = 1; /* only if P frame */ 83 s->per_mb_rl_table = 0; 84 s->mspel= 0; 85 w->per_mb_abt=0; 86 w->abt_type=0; 87 w->j_type=0; 88 89 av_assert0(s->flipflop_rounding); 90 91 if (s->pict_type == AV_PICTURE_TYPE_I) { 92 av_assert0(s->no_rounding==1); 93 if(w->j_type_bit) put_bits(&s->pb, 1, w->j_type); 94 95 if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); 96 97 if(!s->per_mb_rl_table){ 98 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); 99 ff_msmpeg4_code012(&s->pb, s->rl_table_index); 100 } 101 102 put_bits(&s->pb, 1, s->dc_table_index); 103 104 s->inter_intra_pred= 0; 105 }else{ 106 int cbp_index; 107 108 put_bits(&s->pb, 2, SKIP_TYPE_NONE); 109 110 ff_msmpeg4_code012(&s->pb, cbp_index=0); 111 if(s->qscale <= 10){ 112 int map[3]= {0,2,1}; 113 w->cbp_table_index= map[cbp_index]; 114 }else if(s->qscale <= 20){ 115 int map[3]= {1,0,2}; 116 w->cbp_table_index= map[cbp_index]; 117 }else{ 118 int map[3]= {2,1,0}; 119 w->cbp_table_index= map[cbp_index]; 120 } 121 122 if(w->mspel_bit) put_bits(&s->pb, 1, s->mspel); 123 124 if(w->abt_flag){ 125 put_bits(&s->pb, 1, w->per_mb_abt^1); 126 if(!w->per_mb_abt){ 127 ff_msmpeg4_code012(&s->pb, w->abt_type); 128 } 129 } 130 131 if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table); 132 133 if(!s->per_mb_rl_table){ 134 ff_msmpeg4_code012(&s->pb, s->rl_table_index); 135 s->rl_chroma_table_index = s->rl_table_index; 136 } 137 put_bits(&s->pb, 1, s->dc_table_index); 138 put_bits(&s->pb, 1, s->mv_table_index); 139 140 s->inter_intra_pred= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); 141 } 142 s->esc3_level_length= 0; 143 s->esc3_run_length= 0; 144 145 return 0; 146} 147 148/* Nearly identical to wmv1 but that is just because we do not use the 149 * useless M$ crap features. It is duplicated here in case someone wants 150 * to add support for these crap features. */ 151void ff_wmv2_encode_mb(MpegEncContext * s, 152 int16_t block[6][64], 153 int motion_x, int motion_y) 154{ 155 Wmv2Context * const w= (Wmv2Context*)s; 156 int cbp, coded_cbp, i; 157 int pred_x, pred_y; 158 uint8_t *coded_block; 159 160 ff_msmpeg4_handle_slices(s); 161 162 if (!s->mb_intra) { 163 /* compute cbp */ 164 cbp = 0; 165 for (i = 0; i < 6; i++) { 166 if (s->block_last_index[i] >= 0) 167 cbp |= 1 << (5 - i); 168 } 169 170 put_bits(&s->pb, 171 ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][1], 172 ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][0]); 173 174 s->misc_bits += get_bits_diff(s); 175 /* motion vector */ 176 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); 177 ff_msmpeg4_encode_motion(s, motion_x - pred_x, 178 motion_y - pred_y); 179 s->mv_bits += get_bits_diff(s); 180 } else { 181 /* compute cbp */ 182 cbp = 0; 183 coded_cbp = 0; 184 for (i = 0; i < 6; i++) { 185 int val, pred; 186 val = (s->block_last_index[i] >= 1); 187 cbp |= val << (5 - i); 188 if (i < 4) { 189 /* predict value for close blocks only for luma */ 190 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); 191 *coded_block = val; 192 val = val ^ pred; 193 } 194 coded_cbp |= val << (5 - i); 195 } 196 197 if (s->pict_type == AV_PICTURE_TYPE_I) { 198 put_bits(&s->pb, 199 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); 200 } else { 201 put_bits(&s->pb, 202 ff_wmv2_inter_table[w->cbp_table_index][cbp][1], 203 ff_wmv2_inter_table[w->cbp_table_index][cbp][0]); 204 } 205 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ 206 if(s->inter_intra_pred){ 207 s->h263_aic_dir=0; 208 put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]); 209 } 210 s->misc_bits += get_bits_diff(s); 211 } 212 213 for (i = 0; i < 6; i++) { 214 ff_msmpeg4_encode_block(s, block[i], i); 215 } 216 if (s->mb_intra) 217 s->i_tex_bits += get_bits_diff(s); 218 else 219 s->p_tex_bits += get_bits_diff(s); 220} 221 222AVCodec ff_wmv2_encoder = { 223 .name = "wmv2", 224 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"), 225 .type = AVMEDIA_TYPE_VIDEO, 226 .id = AV_CODEC_ID_WMV2, 227 .priv_data_size = sizeof(Wmv2Context), 228 .init = wmv2_encode_init, 229 .encode2 = ff_MPV_encode_picture, 230 .close = ff_MPV_encode_end, 231 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, 232}; 233