2 * Copyright (c) 2002 The FFmpeg Project
4 * This file is part of FFmpeg.
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.
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.
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
23 #include "mpegvideo.h"
25 #include "msmpeg4data.h"
29 static int encode_ext_header(Wmv2Context
*w
)
31 MpegEncContext
*const s
= &w
->s
;
35 init_put_bits(&pb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
);
37 put_bits(&pb
, 5, s
->avctx
->time_base
.den
/ s
->avctx
->time_base
.num
); // yes 29.97 -> 29
38 put_bits(&pb
, 11, FFMIN(s
->bit_rate
/ 1024, 2047));
40 put_bits(&pb
, 1, w
->mspel_bit
= 1);
41 put_bits(&pb
, 1, s
->loop_filter
);
42 put_bits(&pb
, 1, w
->abt_flag
= 1);
43 put_bits(&pb
, 1, w
->j_type_bit
= 1);
44 put_bits(&pb
, 1, w
->top_left_mv_flag
= 0);
45 put_bits(&pb
, 1, w
->per_mb_rl_bit
= 1);
46 put_bits(&pb
, 3, code
= 1);
50 s
->slice_height
= s
->mb_height
/ code
;
55 static av_cold
int wmv2_encode_init(AVCodecContext
*avctx
)
57 Wmv2Context
*const w
= avctx
->priv_data
;
59 if (ff_mpv_encode_init(avctx
) < 0)
62 ff_wmv2_common_init(w
);
64 avctx
->extradata_size
= 4;
65 avctx
->extradata
= av_mallocz(avctx
->extradata_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
66 if (!avctx
->extradata
)
67 return AVERROR(ENOMEM
);
73 int ff_wmv2_encode_picture_header(MpegEncContext
*s
, int picture_number
)
75 Wmv2Context
*const w
= (Wmv2Context
*) s
;
77 put_bits(&s
->pb
, 1, s
->pict_type
- 1);
78 if (s
->pict_type
== AV_PICTURE_TYPE_I
)
79 put_bits(&s
->pb
, 7, 0);
80 put_bits(&s
->pb
, 5, s
->qscale
);
82 s
->dc_table_index
= 1;
83 s
->mv_table_index
= 1; /* only if P frame */
84 s
->per_mb_rl_table
= 0;
90 av_assert0(s
->flipflop_rounding
);
92 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
93 av_assert0(s
->no_rounding
== 1);
95 put_bits(&s
->pb
, 1, w
->j_type
);
98 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
100 if (!s
->per_mb_rl_table
) {
101 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
102 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
105 put_bits(&s
->pb
, 1, s
->dc_table_index
);
107 s
->inter_intra_pred
= 0;
111 put_bits(&s
->pb
, 2, SKIP_TYPE_NONE
);
113 ff_msmpeg4_code012(&s
->pb
, cbp_index
= 0);
114 if (s
->qscale
<= 10) {
115 int map
[3] = { 0, 2, 1 };
116 w
->cbp_table_index
= map
[cbp_index
];
117 } else if (s
->qscale
<= 20) {
118 int map
[3] = { 1, 0, 2 };
119 w
->cbp_table_index
= map
[cbp_index
];
121 int map
[3] = { 2, 1, 0 };
122 w
->cbp_table_index
= map
[cbp_index
];
126 put_bits(&s
->pb
, 1, s
->mspel
);
129 put_bits(&s
->pb
, 1, w
->per_mb_abt
^ 1);
131 ff_msmpeg4_code012(&s
->pb
, w
->abt_type
);
134 if (w
->per_mb_rl_bit
)
135 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
137 if (!s
->per_mb_rl_table
) {
138 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
139 s
->rl_chroma_table_index
= s
->rl_table_index
;
141 put_bits(&s
->pb
, 1, s
->dc_table_index
);
142 put_bits(&s
->pb
, 1, s
->mv_table_index
);
144 s
->inter_intra_pred
= 0; // (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE);
146 s
->esc3_level_length
= 0;
147 s
->esc3_run_length
= 0;
152 /* Nearly identical to wmv1 but that is just because we do not use the
153 * useless M$ crap features. It is duplicated here in case someone wants
154 * to add support for these crap features. */
155 void ff_wmv2_encode_mb(MpegEncContext
*s
, int16_t block
[6][64],
156 int motion_x
, int motion_y
)
158 Wmv2Context
*const w
= (Wmv2Context
*) s
;
159 int cbp
, coded_cbp
, i
;
161 uint8_t *coded_block
;
163 ff_msmpeg4_handle_slices(s
);
168 for (i
= 0; i
< 6; i
++)
169 if (s
->block_last_index
[i
] >= 0)
173 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][1],
174 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][0]);
176 s
->misc_bits
+= get_bits_diff(s
);
178 ff_h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
179 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
181 s
->mv_bits
+= get_bits_diff(s
);
186 for (i
= 0; i
< 6; i
++) {
188 val
= (s
->block_last_index
[i
] >= 1);
189 cbp
|= val
<< (5 - i
);
191 /* predict value for close blocks only for luma */
192 pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
196 coded_cbp
|= val
<< (5 - i
);
199 if (s
->pict_type
== AV_PICTURE_TYPE_I
)
201 ff_msmp4_mb_i_table
[coded_cbp
][1],
202 ff_msmp4_mb_i_table
[coded_cbp
][0]);
205 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
][1],
206 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
][0]);
207 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
208 if (s
->inter_intra_pred
) {
211 ff_table_inter_intra
[s
->h263_aic_dir
][1],
212 ff_table_inter_intra
[s
->h263_aic_dir
][0]);
214 s
->misc_bits
+= get_bits_diff(s
);
217 for (i
= 0; i
< 6; i
++)
218 ff_msmpeg4_encode_block(s
, block
[i
], i
);
220 s
->i_tex_bits
+= get_bits_diff(s
);
222 s
->p_tex_bits
+= get_bits_diff(s
);
225 FF_MPV_GENERIC_CLASS(wmv2
)
227 AVCodec ff_wmv2_encoder
= {
229 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),
230 .type
= AVMEDIA_TYPE_VIDEO
,
231 .id
= AV_CODEC_ID_WMV2
,
232 .priv_data_size
= sizeof(Wmv2Context
),
233 .init
= wmv2_encode_init
,
234 .encode2
= ff_mpv_encode_picture
,
235 .close
= ff_mpv_encode_end
,
236 .pix_fmts
= (const enum AVPixelFormat
[]) { AV_PIX_FMT_YUV420P
,
238 .priv_class
= &wmv2_class
,