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