FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
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 "
h263.h
"
23
#include "
mpegvideo.h
"
24
#include "
msmpeg4.h
"
25
#include "
msmpeg4data.h
"
26
#include "
wmv2.h
"
27
28
29
static
int
encode_ext_header
(
Wmv2Context
*w)
30
{
31
MpegEncContext
*
const
s
= &w->
s
;
32
PutBitContext
pb;
33
int
code;
34
35
init_put_bits
(&pb, s->
avctx
->
extradata
, s->
avctx
->
extradata_size
);
36
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));
39
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);
47
48
flush_put_bits
(&pb);
49
50
s->
slice_height
= s->
mb_height
/ code;
51
52
return
0;
53
}
54
55
static
av_cold
int
wmv2_encode_init
(
AVCodecContext
*avctx)
56
{
57
Wmv2Context
*
const
w = avctx->
priv_data
;
58
59
if
(
ff_mpv_encode_init
(avctx) < 0)
60
return
-1;
61
62
ff_wmv2_common_init
(w);
63
64
avctx->
extradata_size
= 4;
65
avctx->
extradata
=
av_mallocz
(avctx->
extradata_size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
66
if
(!avctx->
extradata
)
67
return
AVERROR
(ENOMEM);
68
encode_ext_header
(w);
69
70
return
0;
71
}
72
73
int
ff_wmv2_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number)
74
{
75
Wmv2Context
*
const
w = (
Wmv2Context
*) s;
76
77
put_bits
(&s->
pb
, 1, s->
pict_type
- 1);
78
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
)
79
put_bits
(&s->
pb
, 7, 0);
80
put_bits
(&s->
pb
, 5, s->
qscale
);
81
82
s->
dc_table_index
= 1;
83
s->
mv_table_index
= 1;
/* only if P frame */
84
s->
per_mb_rl_table
= 0;
85
s->
mspel
= 0;
86
w->
per_mb_abt
= 0;
87
w->
abt_type
= 0;
88
w->
j_type
= 0;
89
90
av_assert0
(s->
flipflop_rounding
);
91
92
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
93
av_assert0
(s->
no_rounding
== 1);
94
if
(w->
j_type_bit
)
95
put_bits
(&s->
pb
, 1, w->
j_type
);
96
97
if
(w->
per_mb_rl_bit
)
98
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
99
100
if
(!s->
per_mb_rl_table
) {
101
ff_msmpeg4_code012
(&s->
pb
, s->
rl_chroma_table_index
);
102
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
103
}
104
105
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
106
107
s->
inter_intra_pred
= 0;
108
}
else
{
109
int
cbp_index;
110
111
put_bits
(&s->
pb
, 2,
SKIP_TYPE_NONE
);
112
113
ff_msmpeg4_code012
(&s->
pb
, cbp_index = 0);
114
if
(s->
qscale
<= 10) {
115
int
map[3] = { 0, 2, 1 };
116
w->
cbp_table_index
= map[cbp_index];
117
}
else
if
(s->
qscale
<= 20) {
118
int
map[3] = { 1, 0, 2 };
119
w->
cbp_table_index
= map[cbp_index];
120
}
else
{
121
int
map[3] = { 2, 1, 0 };
122
w->
cbp_table_index
= map[cbp_index];
123
}
124
125
if
(w->
mspel_bit
)
126
put_bits
(&s->
pb
, 1, s->
mspel
);
127
128
if
(w->
abt_flag
) {
129
put_bits
(&s->
pb
, 1, w->
per_mb_abt
^ 1);
130
if
(!w->
per_mb_abt
)
131
ff_msmpeg4_code012
(&s->
pb
, w->
abt_type
);
132
}
133
134
if
(w->
per_mb_rl_bit
)
135
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
136
137
if
(!s->
per_mb_rl_table
) {
138
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
139
s->
rl_chroma_table_index
= s->
rl_table_index
;
140
}
141
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
142
put_bits
(&s->
pb
, 1, s->
mv_table_index
);
143
144
s->
inter_intra_pred
= 0;
// (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE);
145
}
146
s->
esc3_level_length
= 0;
147
s->
esc3_run_length
= 0;
148
149
return
0;
150
}
151
152
/* Nearly identical to wmv1 but that is just because we do not use the
153
* useless M$ crap features. It is duplicated here in case someone wants
154
* to add support for these crap features. */
155
void
ff_wmv2_encode_mb
(
MpegEncContext
*
s
, int16_t
block
[6][64],
156
int
motion_x,
int
motion_y)
157
{
158
Wmv2Context
*
const
w = (
Wmv2Context
*) s;
159
int
cbp, coded_cbp, i;
160
int
pred_x, pred_y;
161
uint8_t
*coded_block;
162
163
ff_msmpeg4_handle_slices
(s);
164
165
if
(!s->
mb_intra
) {
166
/* compute cbp */
167
cbp = 0;
168
for
(i = 0; i < 6; i++)
169
if
(s->
block_last_index
[i] >= 0)
170
cbp |= 1 << (5 - i);
171
172
put_bits
(&s->
pb
,
173
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][1],
174
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][0]);
175
176
s->
misc_bits
+=
get_bits_diff
(s);
177
/* motion vector */
178
ff_h263_pred_motion
(s, 0, 0, &pred_x, &pred_y);
179
ff_msmpeg4_encode_motion
(s, motion_x - pred_x,
180
motion_y - pred_y);
181
s->
mv_bits
+=
get_bits_diff
(s);
182
}
else
{
183
/* compute cbp */
184
cbp = 0;
185
coded_cbp = 0;
186
for
(i = 0; i < 6; i++) {
187
int
val
,
pred
;
188
val = (s->
block_last_index
[i] >= 1);
189
cbp |= val << (5 - i);
190
if
(i < 4) {
191
/* predict value for close blocks only for luma */
192
pred =
ff_msmpeg4_coded_block_pred
(s, i, &coded_block);
193
*coded_block =
val
;
194
val = val ^
pred
;
195
}
196
coded_cbp |= val << (5 - i);
197
}
198
199
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
)
200
put_bits
(&s->
pb
,
201
ff_msmp4_mb_i_table
[coded_cbp][1],
202
ff_msmp4_mb_i_table
[coded_cbp][0]);
203
else
204
put_bits
(&s->
pb
,
205
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][1],
206
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][0]);
207
put_bits
(&s->
pb
, 1, 0);
/* no AC prediction yet */
208
if
(s->
inter_intra_pred
) {
209
s->
h263_aic_dir
= 0;
210
put_bits
(&s->
pb
,
211
ff_table_inter_intra
[s->
h263_aic_dir
][1],
212
ff_table_inter_intra
[s->
h263_aic_dir
][0]);
213
}
214
s->
misc_bits
+=
get_bits_diff
(s);
215
}
216
217
for
(i = 0; i < 6; i++)
218
ff_msmpeg4_encode_block
(s, block[i], i);
219
if
(s->
mb_intra
)
220
s->
i_tex_bits
+=
get_bits_diff
(s);
221
else
222
s->
p_tex_bits
+=
get_bits_diff
(s);
223
}
224
225
AVCodec
ff_wmv2_encoder
= {
226
.
name
=
"wmv2"
,
227
.long_name =
NULL_IF_CONFIG_SMALL
(
"Windows Media Video 8"
),
228
.type =
AVMEDIA_TYPE_VIDEO
,
229
.id =
AV_CODEC_ID_WMV2
,
230
.priv_data_size =
sizeof
(
Wmv2Context
),
231
.
init
=
wmv2_encode_init
,
232
.encode2 =
ff_mpv_encode_picture
,
233
.
close
=
ff_mpv_encode_end
,
234
.pix_fmts = (
const
enum
AVPixelFormat
[]) {
AV_PIX_FMT_YUV420P
,
235
AV_PIX_FMT_NONE
},
236
};
Generated on Sun Sep 14 2014 18:56:07 for FFmpeg by
1.8.2