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 #if 0 /* unused, remove? */
70 static av_cold
int wmv2_encode_end(AVCodecContext
*avctx
){
72 if(MPV_encode_end(avctx
) < 0)
75 avctx
->extradata_size
= 0;
76 av_freep(&avctx
->extradata
);
82 int ff_wmv2_encode_picture_header(MpegEncContext
* s
, int picture_number
)
84 Wmv2Context
* const w
= (Wmv2Context
*)s
;
86 put_bits(&s
->pb
, 1, s
->pict_type
- 1);
87 if(s
->pict_type
== FF_I_TYPE
){
88 put_bits(&s
->pb
, 7, 0);
90 put_bits(&s
->pb
, 5, s
->qscale
);
92 s
->dc_table_index
= 1;
93 s
->mv_table_index
= 1; /* only if P frame */
94 // s->use_skip_mb_code = 1; /* only if P frame */
95 s
->per_mb_rl_table
= 0;
101 assert(s
->flipflop_rounding
);
103 if (s
->pict_type
== FF_I_TYPE
) {
104 assert(s
->no_rounding
==1);
105 if(w
->j_type_bit
) put_bits(&s
->pb
, 1, w
->j_type
);
107 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
109 if(!s
->per_mb_rl_table
){
110 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
111 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
114 put_bits(&s
->pb
, 1, s
->dc_table_index
);
116 s
->inter_intra_pred
= 0;
120 put_bits(&s
->pb
, 2, SKIP_TYPE_NONE
);
122 ff_msmpeg4_code012(&s
->pb
, cbp_index
=0);
125 w
->cbp_table_index
= map
[cbp_index
];
126 }else if(s
->qscale
<= 20){
128 w
->cbp_table_index
= map
[cbp_index
];
131 w
->cbp_table_index
= map
[cbp_index
];
134 if(w
->mspel_bit
) put_bits(&s
->pb
, 1, s
->mspel
);
137 put_bits(&s
->pb
, 1, w
->per_mb_abt
^1);
139 ff_msmpeg4_code012(&s
->pb
, w
->abt_type
);
143 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
145 if(!s
->per_mb_rl_table
){
146 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
147 s
->rl_chroma_table_index
= s
->rl_table_index
;
149 put_bits(&s
->pb
, 1, s
->dc_table_index
);
150 put_bits(&s
->pb
, 1, s
->mv_table_index
);
152 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
154 s
->esc3_level_length
= 0;
155 s
->esc3_run_length
= 0;
160 /* Nearly identical to wmv1 but that is just because we do not use the
161 * useless M$ crap features. It is duplicated here in case someone wants
162 * to add support for these crap features. */
163 void ff_wmv2_encode_mb(MpegEncContext
* s
,
164 DCTELEM block
[6][64],
165 int motion_x
, int motion_y
)
167 Wmv2Context
* const w
= (Wmv2Context
*)s
;
168 int cbp
, coded_cbp
, i
;
170 uint8_t *coded_block
;
172 ff_msmpeg4_handle_slices(s
);
177 for (i
= 0; i
< 6; i
++) {
178 if (s
->block_last_index
[i
] >= 0)
183 wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][1],
184 wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][0]);
187 h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
188 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
194 for (i
= 0; i
< 6; i
++) {
196 val
= (s
->block_last_index
[i
] >= 1);
197 cbp
|= val
<< (5 - i
);
199 /* predict value for close blocks only for luma */
200 pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
204 coded_cbp
|= val
<< (5 - i
);
208 printf("cbp=%x %x\n", cbp
, coded_cbp
);
211 if (s
->pict_type
== FF_I_TYPE
) {
213 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
216 wmv2_inter_table
[w
->cbp_table_index
][cbp
][1],
217 wmv2_inter_table
[w
->cbp_table_index
][cbp
][0]);
219 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
220 if(s
->inter_intra_pred
){
222 put_bits(&s
->pb
, table_inter_intra
[s
->h263_aic_dir
][1], table_inter_intra
[s
->h263_aic_dir
][0]);
226 for (i
= 0; i
< 6; i
++) {
227 ff_msmpeg4_encode_block(s
, block
[i
], i
);
231 AVCodec wmv2_encoder
= {
239 .pix_fmts
= (enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_NONE
},
240 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),