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