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
){
30 MpegEncContext
* const s
= &w
->s
;
34 init_put_bits(&pb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
);
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));
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);
49 s
->slice_height
= s
->mb_height
/ code
;
54 static av_cold
int wmv2_encode_init(AVCodecContext
*avctx
){
55 Wmv2Context
* const w
= avctx
->priv_data
;
57 if(MPV_encode_init(avctx
) < 0)
60 ff_wmv2_common_init(w
);
62 avctx
->extradata_size
= 4;
63 avctx
->extradata
= av_mallocz(avctx
->extradata_size
+ 10);
69 int ff_wmv2_encode_picture_header(MpegEncContext
* s
, int picture_number
)
71 Wmv2Context
* const w
= (Wmv2Context
*)s
;
73 put_bits(&s
->pb
, 1, s
->pict_type
- 1);
74 if(s
->pict_type
== FF_I_TYPE
){
75 put_bits(&s
->pb
, 7, 0);
77 put_bits(&s
->pb
, 5, s
->qscale
);
79 s
->dc_table_index
= 1;
80 s
->mv_table_index
= 1; /* only if P frame */
81 s
->per_mb_rl_table
= 0;
87 assert(s
->flipflop_rounding
);
89 if (s
->pict_type
== FF_I_TYPE
) {
90 assert(s
->no_rounding
==1);
91 if(w
->j_type_bit
) put_bits(&s
->pb
, 1, w
->j_type
);
93 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
95 if(!s
->per_mb_rl_table
){
96 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
97 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
100 put_bits(&s
->pb
, 1, s
->dc_table_index
);
102 s
->inter_intra_pred
= 0;
106 put_bits(&s
->pb
, 2, SKIP_TYPE_NONE
);
108 ff_msmpeg4_code012(&s
->pb
, cbp_index
=0);
111 w
->cbp_table_index
= map
[cbp_index
];
112 }else if(s
->qscale
<= 20){
114 w
->cbp_table_index
= map
[cbp_index
];
117 w
->cbp_table_index
= map
[cbp_index
];
120 if(w
->mspel_bit
) put_bits(&s
->pb
, 1, s
->mspel
);
123 put_bits(&s
->pb
, 1, w
->per_mb_abt
^1);
125 ff_msmpeg4_code012(&s
->pb
, w
->abt_type
);
129 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
131 if(!s
->per_mb_rl_table
){
132 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
133 s
->rl_chroma_table_index
= s
->rl_table_index
;
135 put_bits(&s
->pb
, 1, s
->dc_table_index
);
136 put_bits(&s
->pb
, 1, s
->mv_table_index
);
138 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
140 s
->esc3_level_length
= 0;
141 s
->esc3_run_length
= 0;
146 /* Nearly identical to wmv1 but that is just because we do not use the
147 * useless M$ crap features. It is duplicated here in case someone wants
148 * to add support for these crap features. */
149 void ff_wmv2_encode_mb(MpegEncContext
* s
,
150 DCTELEM block
[6][64],
151 int motion_x
, int motion_y
)
153 Wmv2Context
* const w
= (Wmv2Context
*)s
;
154 int cbp
, coded_cbp
, i
;
156 uint8_t *coded_block
;
158 ff_msmpeg4_handle_slices(s
);
163 for (i
= 0; i
< 6; i
++) {
164 if (s
->block_last_index
[i
] >= 0)
169 wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][1],
170 wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][0]);
173 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
174 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
180 for (i
= 0; i
< 6; i
++) {
182 val
= (s
->block_last_index
[i
] >= 1);
183 cbp
|= val
<< (5 - i
);
185 /* predict value for close blocks only for luma */
186 pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
190 coded_cbp
|= val
<< (5 - i
);
193 if (s
->pict_type
== FF_I_TYPE
) {
195 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
198 wmv2_inter_table
[w
->cbp_table_index
][cbp
][1],
199 wmv2_inter_table
[w
->cbp_table_index
][cbp
][0]);
201 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
202 if(s
->inter_intra_pred
){
204 put_bits(&s
->pb
, table_inter_intra
[s
->h263_aic_dir
][1], table_inter_intra
[s
->h263_aic_dir
][0]);
208 for (i
= 0; i
< 6; i
++) {
209 ff_msmpeg4_encode_block(s
, block
[i
], i
);
213 AVCodec wmv2_encoder
= {
221 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
222 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),