2 * Copyright (c) 2002 The Libav Project
4 * This file is part of Libav.
6 * Libav 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 * Libav 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 Libav; 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"
30 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
){
56 Wmv2Context
* const w
= avctx
->priv_data
;
58 if(ff_MPV_encode_init(avctx
) < 0)
61 ff_wmv2_common_init(w
);
63 avctx
->extradata_size
= 4;
64 avctx
->extradata
= av_mallocz(avctx
->extradata_size
+ 10);
70 int ff_wmv2_encode_picture_header(MpegEncContext
* s
, int picture_number
)
72 Wmv2Context
* const w
= (Wmv2Context
*)s
;
74 put_bits(&s
->pb
, 1, s
->pict_type
- 1);
75 if(s
->pict_type
== AV_PICTURE_TYPE_I
){
76 put_bits(&s
->pb
, 7, 0);
78 put_bits(&s
->pb
, 5, s
->qscale
);
80 s
->dc_table_index
= 1;
81 s
->mv_table_index
= 1; /* only if P frame */
82 s
->per_mb_rl_table
= 0;
88 assert(s
->flipflop_rounding
);
90 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
91 assert(s
->no_rounding
==1);
92 if(w
->j_type_bit
) put_bits(&s
->pb
, 1, w
->j_type
);
94 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
96 if(!s
->per_mb_rl_table
){
97 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
98 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
101 put_bits(&s
->pb
, 1, s
->dc_table_index
);
103 s
->inter_intra_pred
= 0;
107 put_bits(&s
->pb
, 2, SKIP_TYPE_NONE
);
109 ff_msmpeg4_code012(&s
->pb
, cbp_index
=0);
112 w
->cbp_table_index
= map
[cbp_index
];
113 }else if(s
->qscale
<= 20){
115 w
->cbp_table_index
= map
[cbp_index
];
118 w
->cbp_table_index
= map
[cbp_index
];
121 if(w
->mspel_bit
) put_bits(&s
->pb
, 1, s
->mspel
);
124 put_bits(&s
->pb
, 1, w
->per_mb_abt
^1);
126 ff_msmpeg4_code012(&s
->pb
, w
->abt_type
);
130 if(w
->per_mb_rl_bit
) put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
132 if(!s
->per_mb_rl_table
){
133 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
134 s
->rl_chroma_table_index
= s
->rl_table_index
;
136 put_bits(&s
->pb
, 1, s
->dc_table_index
);
137 put_bits(&s
->pb
, 1, s
->mv_table_index
);
139 s
->inter_intra_pred
= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
141 s
->esc3_level_length
= 0;
142 s
->esc3_run_length
= 0;
147 /* Nearly identical to wmv1 but that is just because we do not use the
148 * useless M$ crap features. It is duplicated here in case someone wants
149 * to add support for these crap features. */
150 void ff_wmv2_encode_mb(MpegEncContext
* s
,
151 int16_t block
[6][64],
152 int motion_x
, int motion_y
)
154 Wmv2Context
* const w
= (Wmv2Context
*)s
;
155 int cbp
, coded_cbp
, i
;
157 uint8_t *coded_block
;
159 ff_msmpeg4_handle_slices(s
);
164 for (i
= 0; i
< 6; i
++) {
165 if (s
->block_last_index
[i
] >= 0)
170 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][1],
171 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
+ 64][0]);
174 ff_h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
175 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
181 for (i
= 0; i
< 6; i
++) {
183 val
= (s
->block_last_index
[i
] >= 1);
184 cbp
|= val
<< (5 - i
);
186 /* predict value for close blocks only for luma */
187 pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
191 coded_cbp
|= val
<< (5 - i
);
194 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
196 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
199 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
][1],
200 ff_wmv2_inter_table
[w
->cbp_table_index
][cbp
][0]);
202 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
203 if(s
->inter_intra_pred
){
205 put_bits(&s
->pb
, ff_table_inter_intra
[s
->h263_aic_dir
][1], ff_table_inter_intra
[s
->h263_aic_dir
][0]);
209 for (i
= 0; i
< 6; i
++) {
210 ff_msmpeg4_encode_block(s
, block
[i
], i
);
214 AVCodec ff_wmv2_encoder
= {
216 .type
= AVMEDIA_TYPE_VIDEO
,
217 .id
= AV_CODEC_ID_WMV2
,
218 .priv_data_size
= sizeof(Wmv2Context
),
219 .init
= wmv2_encode_init
,
220 .encode2
= ff_MPV_encode_picture
,
221 .close
= ff_MPV_encode_end
,
222 .pix_fmts
= (const enum AVPixelFormat
[]){ AV_PIX_FMT_YUV420P
, AV_PIX_FMT_NONE
},
223 .long_name
= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),