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