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
w->
cbp_table_index
=
wmv2_get_cbp_table_index
(s, cbp_index);
115
116
if
(w->
mspel_bit
)
117
put_bits
(&s->
pb
, 1, s->
mspel
);
118
119
if
(w->
abt_flag
) {
120
put_bits
(&s->
pb
, 1, w->
per_mb_abt
^ 1);
121
if
(!w->
per_mb_abt
)
122
ff_msmpeg4_code012
(&s->
pb
, w->
abt_type
);
123
}
124
125
if
(w->
per_mb_rl_bit
)
126
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
127
128
if
(!s->
per_mb_rl_table
) {
129
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
130
s->
rl_chroma_table_index
= s->
rl_table_index
;
131
}
132
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
133
put_bits
(&s->
pb
, 1, s->
mv_table_index
);
134
135
s->
inter_intra_pred
= 0;
// (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE);
136
}
137
s->
esc3_level_length
= 0;
138
s->
esc3_run_length
= 0;
139
140
return
0;
141
}
142
143
/* Nearly identical to wmv1 but that is just because we do not use the
144
* useless M$ crap features. It is duplicated here in case someone wants
145
* to add support for these crap features. */
146
void
ff_wmv2_encode_mb
(
MpegEncContext
*
s
, int16_t
block
[6][64],
147
int
motion_x,
int
motion_y)
148
{
149
Wmv2Context
*
const
w = (
Wmv2Context
*) s;
150
int
cbp, coded_cbp, i;
151
int
pred_x, pred_y;
152
uint8_t
*coded_block;
153
154
ff_msmpeg4_handle_slices
(s);
155
156
if
(!s->
mb_intra
) {
157
/* compute cbp */
158
cbp = 0;
159
for
(i = 0; i < 6; i++)
160
if
(s->
block_last_index
[i] >= 0)
161
cbp |= 1 << (5 - i);
162
163
put_bits
(&s->
pb
,
164
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][1],
165
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][0]);
166
167
s->
misc_bits
+=
get_bits_diff
(s);
168
/* motion vector */
169
ff_h263_pred_motion
(s, 0, 0, &pred_x, &pred_y);
170
ff_msmpeg4_encode_motion
(s, motion_x - pred_x,
171
motion_y - pred_y);
172
s->
mv_bits
+=
get_bits_diff
(s);
173
}
else
{
174
/* compute cbp */
175
cbp = 0;
176
coded_cbp = 0;
177
for
(i = 0; i < 6; i++) {
178
int
val
,
pred
;
179
val = (s->
block_last_index
[i] >= 1);
180
cbp |= val << (5 - i);
181
if
(i < 4) {
182
/* predict value for close blocks only for luma */
183
pred =
ff_msmpeg4_coded_block_pred
(s, i, &coded_block);
184
*coded_block =
val
;
185
val = val ^
pred
;
186
}
187
coded_cbp |= val << (5 - i);
188
}
189
190
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
)
191
put_bits
(&s->
pb
,
192
ff_msmp4_mb_i_table
[coded_cbp][1],
193
ff_msmp4_mb_i_table
[coded_cbp][0]);
194
else
195
put_bits
(&s->
pb
,
196
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][1],
197
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][0]);
198
put_bits
(&s->
pb
, 1, 0);
/* no AC prediction yet */
199
if
(s->
inter_intra_pred
) {
200
s->
h263_aic_dir
= 0;
201
put_bits
(&s->
pb
,
202
ff_table_inter_intra
[s->
h263_aic_dir
][1],
203
ff_table_inter_intra
[s->
h263_aic_dir
][0]);
204
}
205
s->
misc_bits
+=
get_bits_diff
(s);
206
}
207
208
for
(i = 0; i < 6; i++)
209
ff_msmpeg4_encode_block
(s, block[i], i);
210
if
(s->
mb_intra
)
211
s->
i_tex_bits
+=
get_bits_diff
(s);
212
else
213
s->
p_tex_bits
+=
get_bits_diff
(s);
214
}
215
216
FF_MPV_GENERIC_CLASS
(wmv2)
217
218
AVCodec
ff_wmv2_encoder
= {
219
.
name
=
"wmv2"
,
220
.long_name =
NULL_IF_CONFIG_SMALL
(
"Windows Media Video 8"
),
221
.type =
AVMEDIA_TYPE_VIDEO
,
222
.id =
AV_CODEC_ID_WMV2
,
223
.priv_data_size =
sizeof
(
Wmv2Context
),
224
.
init
=
wmv2_encode_init
,
225
.encode2 =
ff_mpv_encode_picture
,
226
.close =
ff_mpv_encode_end
,
227
.pix_fmts = (
const
enum
AVPixelFormat
[]) {
AV_PIX_FMT_YUV420P
,
228
AV_PIX_FMT_NONE
},
229
.priv_class = &wmv2_class,
230
};
Generated on Sun Mar 8 2015 02:35:03 for FFmpeg by
1.8.2