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 "
mpegvideo.h
"
23
#include "
msmpeg4.h
"
24
#include "
msmpeg4data.h
"
25
#include "
h263.h
"
26
#include "
wmv2.h
"
27
28
29
static
int
encode_ext_header
(
Wmv2Context
*w){
30
MpegEncContext
*
const
s
= &w->
s
;
31
PutBitContext
pb;
32
int
code;
33
34
init_put_bits
(&pb, s->
avctx
->
extradata
, s->
avctx
->
extradata_size
);
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
54
static
av_cold
int
wmv2_encode_init
(
AVCodecContext
*avctx){
55
Wmv2Context
*
const
w= avctx->
priv_data
;
56
57
if
(
ff_MPV_encode_init
(avctx) < 0)
58
return
-1;
59
60
ff_wmv2_common_init
(w);
61
62
avctx->
extradata_size
= 4;
63
avctx->
extradata
=
av_mallocz
(avctx->
extradata_size
+ 10);
64
encode_ext_header
(w);
65
66
return
0;
67
}
68
69
int
ff_wmv2_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number)
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
87
av_assert0
(s->
flipflop_rounding
);
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
){
96
ff_msmpeg4_code012
(&s->
pb
, s->
rl_chroma_table_index
);
97
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
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
){
132
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
133
s->
rl_chroma_table_index
= s->
rl_table_index
;
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. */
149
void
ff_wmv2_encode_mb
(
MpegEncContext
*
s
,
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
158
ff_msmpeg4_handle_slices
(s);
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
s->
misc_bits
+=
get_bits_diff
(s);
173
/* motion vector */
174
ff_h263_pred_motion
(s, 0, 0, &pred_x, &pred_y);
175
ff_msmpeg4_encode_motion
(s, motion_x - pred_x,
176
motion_y - pred_y);
177
s->
mv_bits
+=
get_bits_diff
(s);
178
}
else
{
179
/* compute cbp */
180
cbp = 0;
181
coded_cbp = 0;
182
for
(i = 0; i < 6; i++) {
183
int
val
,
pred
;
184
val = (s->
block_last_index
[i] >= 1);
185
cbp |= val << (5 - i);
186
if
(i < 4) {
187
/* predict value for close blocks only for luma */
188
pred =
ff_msmpeg4_coded_block_pred
(s, i, &coded_block);
189
*coded_block =
val
;
190
val = val ^
pred
;
191
}
192
coded_cbp |= val << (5 - i);
193
}
194
195
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
196
put_bits
(&s->
pb
,
197
ff_msmp4_mb_i_table
[coded_cbp][1],
ff_msmp4_mb_i_table
[coded_cbp][0]);
198
}
else
{
199
put_bits
(&s->
pb
,
200
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][1],
201
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][0]);
202
}
203
put_bits
(&s->
pb
, 1, 0);
/* no AC prediction yet */
204
if
(s->
inter_intra_pred
){
205
s->
h263_aic_dir
=0;
206
put_bits
(&s->
pb
,
ff_table_inter_intra
[s->
h263_aic_dir
][1],
ff_table_inter_intra
[s->
h263_aic_dir
][0]);
207
}
208
s->
misc_bits
+=
get_bits_diff
(s);
209
}
210
211
for
(i = 0; i < 6; i++) {
212
ff_msmpeg4_encode_block
(s, block[i], i);
213
}
214
if
(s->
mb_intra
)
215
s->
i_tex_bits
+=
get_bits_diff
(s);
216
else
217
s->
p_tex_bits
+=
get_bits_diff
(s);
218
}
219
220
AVCodec
ff_wmv2_encoder
= {
221
.
name
=
"wmv2"
,
222
.long_name =
NULL_IF_CONFIG_SMALL
(
"Windows Media Video 8"
),
223
.type =
AVMEDIA_TYPE_VIDEO
,
224
.id =
AV_CODEC_ID_WMV2
,
225
.priv_data_size =
sizeof
(
Wmv2Context
),
226
.
init
=
wmv2_encode_init
,
227
.encode2 =
ff_MPV_encode_picture
,
228
.
close
=
ff_MPV_encode_end
,
229
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
230
};
Generated on Sun Mar 23 2014 23:50:06 for FFmpeg by
1.8.2