2 * MSMPEG4 encoder backend
3 * Copyright (c) 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of FFmpeg.
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * MSMPEG4 encoder backend
33 #include "libavutil/attributes.h"
34 #include "libavutil/avutil.h"
35 #include "libavutil/thread.h"
36 #include "codec_internal.h"
37 #include "mpegvideo.h"
38 #include "mpegvideoenc.h"
41 #include "mpeg4video.h"
43 #include "msmpeg4data.h"
44 #include "msmpeg4_vc1_data.h"
45 #include "msmpeg4enc.h"
49 static uint8_t rl_length
[NB_RL_TABLES
][MAX_LEVEL
+1][MAX_RUN
+1][2];
51 /* build the table which associate a (x,y) motion vector to a vlc */
52 static av_cold
void init_mv_table(MVTable
*tab
, uint16_t table_mv_index
[4096])
56 tab
->table_mv_index
= table_mv_index
;
58 /* mark all entries as not used */
60 tab
->table_mv_index
[i
] = MSMPEG4_MV_TABLES_NB_ELEMS
;
62 for (i
= 0; i
< MSMPEG4_MV_TABLES_NB_ELEMS
; i
++) {
63 x
= tab
->table_mvx
[i
];
64 y
= tab
->table_mvy
[i
];
65 tab
->table_mv_index
[(x
<< 6) | y
] = i
;
69 void ff_msmpeg4_code012(PutBitContext
*pb
, int n
)
74 put_bits(pb
, 2, 2 | (n
>= 2));
78 static int get_size_of_code(const RLTable
*rl
, int last
, int run
,
83 int run_diff
= intra
? 0 : 1;
85 code
= get_rl_index(rl
, last
, run
, level
);
86 size
+= rl
->table_vlc
[code
][1];
90 level1
= level
- rl
->max_level
[last
][run
];
93 code
= get_rl_index(rl
, last
, run
, level1
);
97 if (level
> MAX_LEVEL
)
99 run1
= run
- rl
->max_run
[last
][level
] - run_diff
;
102 code
= get_rl_index(rl
, last
, run1
, level
);
109 size
+= 1+1+ rl
->table_vlc
[code
][1];
113 size
+= 1+1+ rl
->table_vlc
[code
][1];
121 static av_cold
void msmpeg4_encode_init_static(void)
123 static uint16_t mv_index_tables
[2][4096];
124 init_mv_table(&ff_mv_tables
[0], mv_index_tables
[0]);
125 init_mv_table(&ff_mv_tables
[1], mv_index_tables
[1]);
127 for (int i
= 0; i
< NB_RL_TABLES
; i
++) {
128 for (int level
= 1; level
<= MAX_LEVEL
; level
++) {
129 for (int run
= 0; run
<= MAX_RUN
; run
++) {
130 for (int last
= 0; last
< 2; last
++) {
131 rl_length
[i
][level
][run
][last
] = get_size_of_code(&ff_rl_table
[i
], last
, run
, level
, 0);
138 av_cold
void ff_msmpeg4_encode_init(MpegEncContext
*s
)
140 static AVOnce init_static_once
= AV_ONCE_INIT
;
142 ff_msmpeg4_common_init(s
);
143 if (s
->msmpeg4_version
>= MSMP4_WMV1
) {
144 s
->min_qcoeff
= -255;
148 /* init various encoding tables */
149 ff_thread_once(&init_static_once
, msmpeg4_encode_init_static
);
152 static void find_best_tables(MSMPEG4EncContext
*ms
)
154 MpegEncContext
*const s
= &ms
->s
;
156 int best
= 0, best_size
= INT_MAX
;
157 int chroma_best
= 0, best_chroma_size
= INT_MAX
;
168 for(level
=0; level
<=MAX_LEVEL
; level
++){
170 for(run
=0; run
<=MAX_RUN
; run
++){
172 const int last_size
= size
+ chroma_size
;
173 for(last
=0; last
<2; last
++){
174 int inter_count
= ms
->ac_stats
[0][0][level
][run
][last
] + ms
->ac_stats
[0][1][level
][run
][last
];
175 int intra_luma_count
= ms
->ac_stats
[1][0][level
][run
][last
];
176 int intra_chroma_count
= ms
->ac_stats
[1][1][level
][run
][last
];
178 if(s
->pict_type
==AV_PICTURE_TYPE_I
){
179 size
+= intra_luma_count
*rl_length
[i
][level
][run
][last
];
180 chroma_size
+= intra_chroma_count
*rl_length
[i
+3][level
][run
][last
];
182 size
+= intra_luma_count
*rl_length
[i
][level
][run
][last
]
183 +intra_chroma_count
*rl_length
[i
+3][level
][run
][last
]
184 +inter_count
*rl_length
[i
+3][level
][run
][last
];
187 if(last_size
== size
+chroma_size
) break;
194 if(chroma_size
<best_chroma_size
){
195 best_chroma_size
= chroma_size
;
200 if(s
->pict_type
==AV_PICTURE_TYPE_P
) chroma_best
= best
;
202 memset(ms
->ac_stats
, 0, sizeof(ms
->ac_stats
));
204 s
->rl_table_index
= best
;
205 s
->rl_chroma_table_index
= chroma_best
;
207 if(s
->pict_type
!= s
->last_non_b_pict_type
){
208 s
->rl_table_index
= 2;
209 if(s
->pict_type
==AV_PICTURE_TYPE_I
)
210 s
->rl_chroma_table_index
= 1;
212 s
->rl_chroma_table_index
= 2;
217 /* write MSMPEG4 compatible frame header */
218 void ff_msmpeg4_encode_picture_header(MpegEncContext
* s
)
220 MSMPEG4EncContext
*const ms
= (MSMPEG4EncContext
*)s
;
222 find_best_tables(ms
);
224 align_put_bits(&s
->pb
);
225 put_bits(&s
->pb
, 2, s
->pict_type
- 1);
227 put_bits(&s
->pb
, 5, s
->qscale
);
228 if (s
->msmpeg4_version
<= MSMP4_V2
) {
229 s
->rl_table_index
= 2;
230 s
->rl_chroma_table_index
= 2;
233 s
->dc_table_index
= 1;
234 s
->mv_table_index
= 1; /* only if P-frame */
235 s
->use_skip_mb_code
= 1; /* only if P-frame */
236 s
->per_mb_rl_table
= 0;
237 if (s
->msmpeg4_version
== MSMP4_WMV1
)
238 s
->inter_intra_pred
= (s
->width
*s
->height
< 320*240 && s
->bit_rate
<=II_BITRATE
&& s
->pict_type
==AV_PICTURE_TYPE_P
);
239 ff_dlog(s
, "%d %"PRId64
" %d %d %d\n", s
->pict_type
, s
->bit_rate
,
240 s
->inter_intra_pred
, s
->width
, s
->height
);
242 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
243 s
->slice_height
= s
->mb_height
/1;
244 put_bits(&s
->pb
, 5, 0x16 + s
->mb_height
/s
->slice_height
);
246 if (s
->msmpeg4_version
== MSMP4_WMV1
) {
247 ff_msmpeg4_encode_ext_header(s
);
248 if(s
->bit_rate
>MBAC_BITRATE
)
249 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
252 if (s
->msmpeg4_version
> MSMP4_V2
) {
253 if(!s
->per_mb_rl_table
){
254 ff_msmpeg4_code012(&s
->pb
, s
->rl_chroma_table_index
);
255 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
258 put_bits(&s
->pb
, 1, s
->dc_table_index
);
261 put_bits(&s
->pb
, 1, s
->use_skip_mb_code
);
263 if (s
->msmpeg4_version
== MSMP4_WMV1
&& s
->bit_rate
> MBAC_BITRATE
)
264 put_bits(&s
->pb
, 1, s
->per_mb_rl_table
);
266 if (s
->msmpeg4_version
> MSMP4_V2
) {
267 if(!s
->per_mb_rl_table
)
268 ff_msmpeg4_code012(&s
->pb
, s
->rl_table_index
);
270 put_bits(&s
->pb
, 1, s
->dc_table_index
);
272 put_bits(&s
->pb
, 1, s
->mv_table_index
);
276 s
->esc3_level_length
= 0;
277 s
->esc3_run_length
= 0;
280 void ff_msmpeg4_encode_ext_header(MpegEncContext
* s
)
284 if (s
->avctx
->framerate
.num
> 0 && s
->avctx
->framerate
.den
> 0)
285 fps
= s
->avctx
->framerate
.num
/ s
->avctx
->framerate
.den
;
287 FF_DISABLE_DEPRECATION_WARNINGS
288 fps
= s
->avctx
->time_base
.den
/ s
->avctx
->time_base
.num
289 #if FF_API_TICKS_PER_FRAME
290 / FFMAX(s
->avctx
->ticks_per_frame
, 1)
293 FF_ENABLE_DEPRECATION_WARNINGS
296 put_bits(&s
->pb
, 5, FFMIN(fps
, 31)); //yes 29.97 -> 29
298 put_bits(&s
->pb
, 11, FFMIN(s
->bit_rate
/ 1024, 2047));
300 if (s
->msmpeg4_version
>= MSMP4_V3
)
301 put_bits(&s
->pb
, 1, s
->flipflop_rounding
);
303 av_assert0(!s
->flipflop_rounding
);
306 void ff_msmpeg4_encode_motion(MpegEncContext
* s
,
312 /* modulo encoding */
313 /* WARNING : you cannot reach all the MVs even with the modulo
314 encoding. This is a somewhat strange compromise they took !!! */
326 mv
= &ff_mv_tables
[s
->mv_table_index
];
328 code
= mv
->table_mv_index
[(mx
<< 6) | my
];
330 mv
->table_mv_bits
[code
],
331 mv
->table_mv_code
[code
]);
332 if (code
== MSMPEG4_MV_TABLES_NB_ELEMS
) {
333 /* escape : code literally */
334 put_bits(&s
->pb
, 6, mx
);
335 put_bits(&s
->pb
, 6, my
);
339 void ff_msmpeg4_handle_slices(MpegEncContext
*s
){
341 if (s
->slice_height
&& (s
->mb_y
% s
->slice_height
) == 0) {
342 if (s
->msmpeg4_version
< MSMP4_WMV1
) {
343 ff_mpeg4_clean_buffers(s
);
345 s
->first_slice_line
= 1;
347 s
->first_slice_line
= 0;
352 static void msmpeg4v2_encode_motion(MpegEncContext
* s
, int val
)
354 int range
, bit_size
, sign
, code
, bits
;
359 put_bits(&s
->pb
, ff_mvtab
[code
][1], ff_mvtab
[code
][0]);
361 bit_size
= s
->f_code
- 1;
362 range
= 1 << bit_size
;
375 code
= (val
>> bit_size
) + 1;
376 bits
= val
& (range
- 1);
378 put_bits(&s
->pb
, ff_mvtab
[code
][1] + 1, (ff_mvtab
[code
][0] << 1) | sign
);
380 put_bits(&s
->pb
, bit_size
, bits
);
385 void ff_msmpeg4_encode_mb(MpegEncContext
* s
,
386 int16_t block
[6][64],
387 int motion_x
, int motion_y
)
389 int cbp
, coded_cbp
, i
;
392 ff_msmpeg4_handle_slices(s
);
397 for (i
= 0; i
< 6; i
++) {
398 if (s
->block_last_index
[i
] >= 0)
401 if (s
->use_skip_mb_code
&& (cbp
| motion_x
| motion_y
) == 0) {
402 /* skip macroblock */
403 put_bits(&s
->pb
, 1, 1);
409 if (s
->use_skip_mb_code
)
410 put_bits(&s
->pb
, 1, 0); /* mb coded */
412 if (s
->msmpeg4_version
<= MSMP4_V2
) {
414 ff_v2_mb_type
[cbp
&3][1],
415 ff_v2_mb_type
[cbp
&3][0]);
416 if((cbp
&3) != 3) coded_cbp
= cbp
^ 0x3C;
420 ff_h263_cbpy_tab
[coded_cbp
>>2][1],
421 ff_h263_cbpy_tab
[coded_cbp
>>2][0]);
423 s
->misc_bits
+= get_bits_diff(s
);
425 ff_h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
426 msmpeg4v2_encode_motion(s
, motion_x
- pred_x
);
427 msmpeg4v2_encode_motion(s
, motion_y
- pred_y
);
430 ff_table_mb_non_intra
[cbp
+ 64][1],
431 ff_table_mb_non_intra
[cbp
+ 64][0]);
433 s
->misc_bits
+= get_bits_diff(s
);
436 ff_h263_pred_motion(s
, 0, 0, &pred_x
, &pred_y
);
437 ff_msmpeg4_encode_motion(s
, motion_x
- pred_x
,
441 s
->mv_bits
+= get_bits_diff(s
);
443 for (i
= 0; i
< 6; i
++) {
444 ff_msmpeg4_encode_block(s
, block
[i
], i
);
446 s
->p_tex_bits
+= get_bits_diff(s
);
450 for (int i
= 0; i
< 6; i
++) {
451 int val
= (s
->block_last_index
[i
] >= 1);
452 cbp
|= val
<< (5 - i
);
454 if (s
->msmpeg4_version
<= MSMP4_V2
) {
455 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
457 ff_v2_intra_cbpc
[cbp
&3][1], ff_v2_intra_cbpc
[cbp
&3][0]);
459 if (s
->use_skip_mb_code
)
460 put_bits(&s
->pb
, 1, 0); /* mb coded */
462 ff_v2_mb_type
[(cbp
&3) + 4][1],
463 ff_v2_mb_type
[(cbp
&3) + 4][0]);
465 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
467 ff_h263_cbpy_tab
[cbp
>>2][1],
468 ff_h263_cbpy_tab
[cbp
>>2][0]);
470 if (s
->pict_type
== AV_PICTURE_TYPE_I
) {
471 /* compute coded_cbp; the 0x3 corresponds to chroma cbp;
472 * luma coded_cbp are set in the loop below */
473 coded_cbp
= cbp
& 0x3;
474 for (int i
= 0; i
< 4; i
++) {
475 uint8_t *coded_block
;
476 int pred
= ff_msmpeg4_coded_block_pred(s
, i
, &coded_block
);
477 int val
= (s
->block_last_index
[i
] >= 1);
480 coded_cbp
|= val
<< (5 - i
);
484 ff_msmp4_mb_i_table
[coded_cbp
][1], ff_msmp4_mb_i_table
[coded_cbp
][0]);
486 if (s
->use_skip_mb_code
)
487 put_bits(&s
->pb
, 1, 0); /* mb coded */
489 ff_table_mb_non_intra
[cbp
][1],
490 ff_table_mb_non_intra
[cbp
][0]);
492 put_bits(&s
->pb
, 1, 0); /* no AC prediction yet */
493 if(s
->inter_intra_pred
){
495 put_bits(&s
->pb
, ff_table_inter_intra
[s
->h263_aic_dir
][1], ff_table_inter_intra
[s
->h263_aic_dir
][0]);
498 s
->misc_bits
+= get_bits_diff(s
);
500 for (i
= 0; i
< 6; i
++) {
501 ff_msmpeg4_encode_block(s
, block
[i
], i
);
503 s
->i_tex_bits
+= get_bits_diff(s
);
508 static void msmpeg4_encode_dc(MpegEncContext
* s
, int level
, int n
, int *dir_ptr
)
514 pred
= ff_msmpeg4_pred_dc(s
, n
, &dc_val
, dir_ptr
);
516 /* update predictor */
518 *dc_val
= level
* s
->y_dc_scale
;
520 *dc_val
= level
* s
->c_dc_scale
;
523 /* do the prediction */
526 if (s
->msmpeg4_version
<= MSMP4_V2
) {
529 ff_v2_dc_lum_table
[level
+ 256][1],
530 ff_v2_dc_lum_table
[level
+ 256][0]);
533 ff_v2_dc_chroma_table
[level
+ 256][1],
534 ff_v2_dc_chroma_table
[level
+ 256][0]);
546 put_bits(&s
->pb
, ff_msmp4_dc_tables
[s
->dc_table_index
][n
>= 4][code
][1],
547 ff_msmp4_dc_tables
[s
->dc_table_index
][n
>= 4][code
][0]);
550 put_bits(&s
->pb
, 8, level
);
553 put_bits(&s
->pb
, 1, sign
);
558 /* Encoding of a block; very similar to MPEG-4 except for a different
559 * escape coding (same as H.263) and more VLC tables. */
560 void ff_msmpeg4_encode_block(MpegEncContext
* s
, int16_t * block
, int n
)
562 MSMPEG4EncContext
*const ms
= (MSMPEG4EncContext
*)s
;
563 int level
, run
, last
, i
, j
, last_index
;
564 int last_non_zero
, sign
, slevel
;
565 int code
, run_diff
, dc_pred_dir
;
567 const uint8_t *scantable
;
570 msmpeg4_encode_dc(s
, block
[0], n
, &dc_pred_dir
);
573 rl
= &ff_rl_table
[s
->rl_table_index
];
575 rl
= &ff_rl_table
[3 + s
->rl_chroma_table_index
];
577 run_diff
= s
->msmpeg4_version
>= MSMP4_WMV1
;
578 scantable
= s
->intra_scantable
.permutated
;
581 rl
= &ff_rl_table
[3 + s
->rl_table_index
];
582 run_diff
= s
->msmpeg4_version
> MSMP4_V2
;
583 scantable
= s
->inter_scantable
.permutated
;
586 /* recalculate block_last_index for M$ wmv1 */
587 if (s
->msmpeg4_version
>= MSMP4_WMV1
&& s
->block_last_index
[n
] > 0) {
588 for(last_index
=63; last_index
>=0; last_index
--){
589 if(block
[scantable
[last_index
]]) break;
591 s
->block_last_index
[n
]= last_index
;
593 last_index
= s
->block_last_index
[n
];
595 last_non_zero
= i
- 1;
596 for (; i
<= last_index
; i
++) {
600 run
= i
- last_non_zero
- 1;
601 last
= (i
== last_index
);
609 if(level
<=MAX_LEVEL
&& run
<=MAX_RUN
){
610 ms
->ac_stats
[s
->mb_intra
][n
>3][level
][run
][last
]++;
613 ms
->ac_stats
[s
->mb_intra
][n
> 3][40][63][0]++; //esc3 like
615 code
= get_rl_index(rl
, last
, run
, level
);
616 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
620 level1
= level
- rl
->max_level
[last
][run
];
623 code
= get_rl_index(rl
, last
, run
, level1
);
626 put_bits(&s
->pb
, 1, 0);
627 if (level
> MAX_LEVEL
)
629 run1
= run
- rl
->max_run
[last
][level
] - run_diff
;
632 code
= get_rl_index(rl
, last
, run1
+1, level
);
633 if (s
->msmpeg4_version
== MSMP4_WMV1
&& code
== rl
->n
)
635 code
= get_rl_index(rl
, last
, run1
, level
);
639 put_bits(&s
->pb
, 1, 0);
640 put_bits(&s
->pb
, 1, last
);
641 if (s
->msmpeg4_version
>= MSMP4_WMV1
) {
642 if(s
->esc3_level_length
==0){
643 s
->esc3_level_length
=8;
644 s
->esc3_run_length
= 6;
645 //ESCLVLSZ + ESCRUNSZ
647 put_bits(&s
->pb
, 6, 3);
649 put_bits(&s
->pb
, 8, 3);
651 put_bits(&s
->pb
, s
->esc3_run_length
, run
);
652 put_bits(&s
->pb
, 1, sign
);
653 put_bits(&s
->pb
, s
->esc3_level_length
, level
);
655 put_bits(&s
->pb
, 6, run
);
656 put_sbits(&s
->pb
, 8, slevel
);
660 put_bits(&s
->pb
, 1, 1);
661 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
662 put_bits(&s
->pb
, 1, sign
);
666 put_bits(&s
->pb
, 1, 1);
667 put_bits(&s
->pb
, rl
->table_vlc
[code
][1], rl
->table_vlc
[code
][0]);
668 put_bits(&s
->pb
, 1, sign
);
671 put_bits(&s
->pb
, 1, sign
);
678 const FFCodec ff_msmpeg4v2_encoder
= {
679 .p
.name
= "msmpeg4v2",
680 CODEC_LONG_NAME("MPEG-4 part 2 Microsoft variant version 2"),
681 .p
.type
= AVMEDIA_TYPE_VIDEO
,
682 .p
.id
= AV_CODEC_ID_MSMPEG4V2
,
683 .p
.pix_fmts
= (const enum AVPixelFormat
[]){ AV_PIX_FMT_YUV420P
, AV_PIX_FMT_NONE
},
684 .color_ranges
= AVCOL_RANGE_MPEG
,
685 .p
.priv_class
= &ff_mpv_enc_class
,
686 .p
.capabilities
= AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
,
687 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,
688 .priv_data_size
= sizeof(MSMPEG4EncContext
),
689 .init
= ff_mpv_encode_init
,
690 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture
),
691 .close
= ff_mpv_encode_end
,
694 const FFCodec ff_msmpeg4v3_encoder
= {
696 CODEC_LONG_NAME("MPEG-4 part 2 Microsoft variant version 3"),
697 .p
.type
= AVMEDIA_TYPE_VIDEO
,
698 .p
.id
= AV_CODEC_ID_MSMPEG4V3
,
699 .p
.pix_fmts
= (const enum AVPixelFormat
[]){ AV_PIX_FMT_YUV420P
, AV_PIX_FMT_NONE
},
700 .color_ranges
= AVCOL_RANGE_MPEG
,
701 .p
.priv_class
= &ff_mpv_enc_class
,
702 .p
.capabilities
= AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
,
703 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,
704 .priv_data_size
= sizeof(MSMPEG4EncContext
),
705 .init
= ff_mpv_encode_init
,
706 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture
),
707 .close
= ff_mpv_encode_end
,
710 const FFCodec ff_wmv1_encoder
= {
712 CODEC_LONG_NAME("Windows Media Video 7"),
713 .p
.type
= AVMEDIA_TYPE_VIDEO
,
714 .p
.id
= AV_CODEC_ID_WMV1
,
715 .p
.pix_fmts
= (const enum AVPixelFormat
[]){ AV_PIX_FMT_YUV420P
, AV_PIX_FMT_NONE
},
716 .color_ranges
= AVCOL_RANGE_MPEG
,
717 .p
.priv_class
= &ff_mpv_enc_class
,
718 .p
.capabilities
= AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
,
719 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,
720 .priv_data_size
= sizeof(MSMPEG4EncContext
),
721 .init
= ff_mpv_encode_init
,
722 FF_CODEC_ENCODE_CB(ff_mpv_encode_picture
),
723 .close
= ff_mpv_encode_end
,