wmv2enc.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002 The FFmpeg Project
3  *
4  * This file is part of FFmpeg.
5  *
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.
10  *
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.
15  *
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
19  */
20 
21 #include "avcodec.h"
22 #include "mpegvideo.h"
23 #include "msmpeg4.h"
24 #include "msmpeg4data.h"
25 #include "h263.h"
26 #include "wmv2.h"
27 
28 
30  MpegEncContext * const s= &w->s;
31  PutBitContext pb;
32  int code;
33 
35 
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));
38 
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);
46 
47  flush_put_bits(&pb);
48 
49  s->slice_height = s->mb_height / code;
50 
51  return 0;
52 }
53 
55  Wmv2Context * const w= avctx->priv_data;
56 
57  if(ff_MPV_encode_init(avctx) < 0)
58  return -1;
59 
61 
62  avctx->extradata_size= 4;
63  avctx->extradata= av_mallocz(avctx->extradata_size + 10);
65 
66  return 0;
67 }
68 
70 {
71  Wmv2Context * const w= (Wmv2Context*)s;
72 
73  put_bits(&s->pb, 1, s->pict_type - 1);
74  if(s->pict_type == AV_PICTURE_TYPE_I){
75  put_bits(&s->pb, 7, 0);
76  }
77  put_bits(&s->pb, 5, s->qscale);
78 
79  s->dc_table_index = 1;
80  s->mv_table_index = 1; /* only if P frame */
81  s->per_mb_rl_table = 0;
82  s->mspel= 0;
83  w->per_mb_abt=0;
84  w->abt_type=0;
85  w->j_type=0;
86 
88 
89  if (s->pict_type == AV_PICTURE_TYPE_I) {
90  av_assert0(s->no_rounding==1);
91  if(w->j_type_bit) put_bits(&s->pb, 1, w->j_type);
92 
93  if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table);
94 
95  if(!s->per_mb_rl_table){
98  }
99 
100  put_bits(&s->pb, 1, s->dc_table_index);
101 
102  s->inter_intra_pred= 0;
103  }else{
104  int cbp_index;
105 
106  put_bits(&s->pb, 2, SKIP_TYPE_NONE);
107 
108  ff_msmpeg4_code012(&s->pb, cbp_index=0);
109  if(s->qscale <= 10){
110  int map[3]= {0,2,1};
111  w->cbp_table_index= map[cbp_index];
112  }else if(s->qscale <= 20){
113  int map[3]= {1,0,2};
114  w->cbp_table_index= map[cbp_index];
115  }else{
116  int map[3]= {2,1,0};
117  w->cbp_table_index= map[cbp_index];
118  }
119 
120  if(w->mspel_bit) put_bits(&s->pb, 1, s->mspel);
121 
122  if(w->abt_flag){
123  put_bits(&s->pb, 1, w->per_mb_abt^1);
124  if(!w->per_mb_abt){
125  ff_msmpeg4_code012(&s->pb, w->abt_type);
126  }
127  }
128 
129  if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table);
130 
131  if(!s->per_mb_rl_table){
134  }
135  put_bits(&s->pb, 1, s->dc_table_index);
136  put_bits(&s->pb, 1, s->mv_table_index);
137 
138  s->inter_intra_pred= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
139  }
140  s->esc3_level_length= 0;
141  s->esc3_run_length= 0;
142 
143  return 0;
144 }
145 
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. */
150  int16_t block[6][64],
151  int motion_x, int motion_y)
152 {
153  Wmv2Context * const w= (Wmv2Context*)s;
154  int cbp, coded_cbp, i;
155  int pred_x, pred_y;
156  uint8_t *coded_block;
157 
159 
160  if (!s->mb_intra) {
161  /* compute cbp */
162  cbp = 0;
163  for (i = 0; i < 6; i++) {
164  if (s->block_last_index[i] >= 0)
165  cbp |= 1 << (5 - i);
166  }
167 
168  put_bits(&s->pb,
169  ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][1],
170  ff_wmv2_inter_table[w->cbp_table_index][cbp + 64][0]);
171 
172  /* motion vector */
173  ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
174  ff_msmpeg4_encode_motion(s, motion_x - pred_x,
175  motion_y - pred_y);
176  } else {
177  /* compute cbp */
178  cbp = 0;
179  coded_cbp = 0;
180  for (i = 0; i < 6; i++) {
181  int val, pred;
182  val = (s->block_last_index[i] >= 1);
183  cbp |= val << (5 - i);
184  if (i < 4) {
185  /* predict value for close blocks only for luma */
186  pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
187  *coded_block = val;
188  val = val ^ pred;
189  }
190  coded_cbp |= val << (5 - i);
191  }
192 
193  if (s->pict_type == AV_PICTURE_TYPE_I) {
194  put_bits(&s->pb,
195  ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
196  } else {
197  put_bits(&s->pb,
200  }
201  put_bits(&s->pb, 1, 0); /* no AC prediction yet */
202  if(s->inter_intra_pred){
203  s->h263_aic_dir=0;
205  }
206  }
207 
208  for (i = 0; i < 6; i++) {
209  ff_msmpeg4_encode_block(s, block[i], i);
210  }
211 }
212 
214  .name = "wmv2",
215  .type = AVMEDIA_TYPE_VIDEO,
216  .id = AV_CODEC_ID_WMV2,
217  .priv_data_size = sizeof(Wmv2Context),
219  .encode2 = ff_MPV_encode_picture,
221  .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
222  .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"),
223 };
int inter_intra_pred
Definition: mpegvideo.h:645
int j_type_bit
Definition: wmv2.h:39
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const char * s
Definition: avisynth_c.h:668
int esc3_level_length
Definition: mpegvideo.h:641
static int encode_ext_header(Wmv2Context *w)
Definition: wmv2enc.c:29
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
int ff_MPV_encode_end(AVCodecContext *avctx)
int per_mb_abt
Definition: wmv2.h:44
int num
numerator
Definition: rational.h:44
mpegvideo header.
int per_mb_rl_bit
Definition: wmv2.h:49
int qscale
QP.
Definition: mpegvideo.h:369
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Definition: h263.c:315
output residual component w
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
AVCodec ff_wmv2_encoder
Definition: wmv2enc.c:213
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int esc3_run_length
Definition: mpegvideo.h:642
uint8_t
#define av_cold
Definition: attributes.h:78
static av_cold int wmv2_encode_init(AVCodecContext *avctx)
Definition: wmv2enc.c:54
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int no_rounding
apply no rounding to motion compensation (MPEG4, msmpeg4, ...) for b-frames rounding mode is always 0...
Definition: mpegvideo.h:439
MSMPEG4 data tables.
int mb_height
number of MBs horizontally & vertically
Definition: mpegvideo.h:277
MpegEncContext s
Definition: wmv2.h:36
int flipflop_rounding
Definition: mpegvideo.h:638
int ff_MPV_encode_init(AVCodecContext *avctx)
const uint16_t ff_msmp4_mb_i_table[64][2]
Definition: msmpeg4data.c:41
int rl_chroma_table_index
Definition: mpegvideo.h:633
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int per_mb_rl_table
Definition: mpegvideo.h:640
const char * name
Name of the codec implementation.
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
external API header
#define FFMIN(a, b)
Definition: common.h:58
int abt_type
Definition: wmv2.h:42
int block_last_index[12]
last non zero coefficient in block
Definition: mpegvideo.h:291
void ff_msmpeg4_encode_motion(MpegEncContext *s, int mx, int my)
Definition: msmpeg4enc.c:287
static const float pred[4]
Definition: siprdata.h:259
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
int abt_flag
Definition: wmv2.h:41
int cbp_table_index
Definition: wmv2.h:47
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
synthesis window for stochastic i
struct Wmv2Context Wmv2Context
int slice_height
in macroblocks
Definition: mpegvideo.h:636
void ff_msmpeg4_handle_slices(MpegEncContext *s)
Definition: msmpeg4enc.c:325
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:377
int bit_rate
wanted bit rate
Definition: mpegvideo.h:248
MpegEncContext.
Definition: mpegvideo.h:241
struct AVCodecContext * avctx
Definition: mpegvideo.h:243
PutBitContext pb
bit output
Definition: mpegvideo.h:314
#define SKIP_TYPE_NONE
Definition: wmv2.h:29
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
void ff_msmpeg4_code012(PutBitContext *pb, int n)
Definition: msmpeg4enc.c:64
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:54
int den
denominator
Definition: rational.h:45
const uint32_t(*const [WMV2_INTER_CBP_TABLE_COUNT] ff_wmv2_inter_table)[2]
Definition: msmpeg4data.c:1986
av_cold void ff_wmv2_common_init(Wmv2Context *w)
Definition: wmv2.c:28
int rl_table_index
Definition: mpegvideo.h:632
int mspel_bit
Definition: wmv2.h:46
int ff_msmpeg4_coded_block_pred(MpegEncContext *s, int n, uint8_t **coded_block_ptr)
Definition: msmpeg4.c:153
void ff_wmv2_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
Definition: wmv2enc.c:149
int mv_table_index
Definition: mpegvideo.h:631
int h263_aic_dir
AIC direction: 0 = left, 1 = top.
Definition: mpegvideo.h:547
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt, AVFrame *frame, int *got_packet)
const uint8_t ff_table_inter_intra[4][2]
Definition: msmpeg4data.c:1874
int dc_table_index
Definition: mpegvideo.h:634
int top_left_mv_flag
Definition: wmv2.h:48
int j_type
Definition: wmv2.h:40
void ff_msmpeg4_encode_block(MpegEncContext *s, int16_t *block, int n)
Definition: msmpeg4enc.c:573
int ff_wmv2_encode_picture_header(MpegEncContext *s, int picture_number)
Definition: wmv2enc.c:69