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
+
FF_INPUT_BUFFER_PADDING_SIZE
);
64
if
(!avctx->
extradata
)
65
return
AVERROR
(ENOMEM);
66
encode_ext_header
(w);
67
68
return
0;
69
}
70
71
int
ff_wmv2_encode_picture_header
(
MpegEncContext
*
s
,
int
picture_number)
72
{
73
Wmv2Context
*
const
w= (
Wmv2Context
*)s;
74
75
put_bits
(&s->
pb
, 1, s->
pict_type
- 1);
76
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
){
77
put_bits
(&s->
pb
, 7, 0);
78
}
79
put_bits
(&s->
pb
, 5, s->
qscale
);
80
81
s->
dc_table_index
= 1;
82
s->
mv_table_index
= 1;
/* only if P frame */
83
s->
per_mb_rl_table
= 0;
84
s->
mspel
= 0;
85
w->
per_mb_abt
=0;
86
w->
abt_type
=0;
87
w->
j_type
=0;
88
89
av_assert0
(s->
flipflop_rounding
);
90
91
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
92
av_assert0
(s->
no_rounding
==1);
93
if
(w->
j_type_bit
)
put_bits
(&s->
pb
, 1, w->
j_type
);
94
95
if
(w->
per_mb_rl_bit
)
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
96
97
if
(!s->
per_mb_rl_table
){
98
ff_msmpeg4_code012
(&s->
pb
, s->
rl_chroma_table_index
);
99
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
100
}
101
102
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
103
104
s->
inter_intra_pred
= 0;
105
}
else
{
106
int
cbp_index;
107
108
put_bits
(&s->
pb
, 2,
SKIP_TYPE_NONE
);
109
110
ff_msmpeg4_code012
(&s->
pb
, cbp_index=0);
111
if
(s->
qscale
<= 10){
112
int
map[3]= {0,2,1};
113
w->
cbp_table_index
= map[cbp_index];
114
}
else
if
(s->
qscale
<= 20){
115
int
map[3]= {1,0,2};
116
w->
cbp_table_index
= map[cbp_index];
117
}
else
{
118
int
map[3]= {2,1,0};
119
w->
cbp_table_index
= map[cbp_index];
120
}
121
122
if
(w->
mspel_bit
)
put_bits
(&s->
pb
, 1, s->
mspel
);
123
124
if
(w->
abt_flag
){
125
put_bits
(&s->
pb
, 1, w->
per_mb_abt
^1);
126
if
(!w->
per_mb_abt
){
127
ff_msmpeg4_code012
(&s->
pb
, w->
abt_type
);
128
}
129
}
130
131
if
(w->
per_mb_rl_bit
)
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
132
133
if
(!s->
per_mb_rl_table
){
134
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
135
s->
rl_chroma_table_index
= s->
rl_table_index
;
136
}
137
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
138
put_bits
(&s->
pb
, 1, s->
mv_table_index
);
139
140
s->
inter_intra_pred
= 0;
//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
141
}
142
s->
esc3_level_length
= 0;
143
s->
esc3_run_length
= 0;
144
145
return
0;
146
}
147
148
/* Nearly identical to wmv1 but that is just because we do not use the
149
* useless M$ crap features. It is duplicated here in case someone wants
150
* to add support for these crap features. */
151
void
ff_wmv2_encode_mb
(
MpegEncContext
*
s
,
152
int16_t
block
[6][64],
153
int
motion_x,
int
motion_y)
154
{
155
Wmv2Context
*
const
w= (
Wmv2Context
*)s;
156
int
cbp, coded_cbp, i;
157
int
pred_x, pred_y;
158
uint8_t
*coded_block;
159
160
ff_msmpeg4_handle_slices
(s);
161
162
if
(!s->
mb_intra
) {
163
/* compute cbp */
164
cbp = 0;
165
for
(i = 0; i < 6; i++) {
166
if
(s->
block_last_index
[i] >= 0)
167
cbp |= 1 << (5 - i);
168
}
169
170
put_bits
(&s->
pb
,
171
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][1],
172
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][0]);
173
174
s->
misc_bits
+=
get_bits_diff
(s);
175
/* motion vector */
176
ff_h263_pred_motion
(s, 0, 0, &pred_x, &pred_y);
177
ff_msmpeg4_encode_motion
(s, motion_x - pred_x,
178
motion_y - pred_y);
179
s->
mv_bits
+=
get_bits_diff
(s);
180
}
else
{
181
/* compute cbp */
182
cbp = 0;
183
coded_cbp = 0;
184
for
(i = 0; i < 6; i++) {
185
int
val
,
pred
;
186
val = (s->
block_last_index
[i] >= 1);
187
cbp |= val << (5 - i);
188
if
(i < 4) {
189
/* predict value for close blocks only for luma */
190
pred =
ff_msmpeg4_coded_block_pred
(s, i, &coded_block);
191
*coded_block =
val
;
192
val = val ^
pred
;
193
}
194
coded_cbp |= val << (5 - i);
195
}
196
197
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
198
put_bits
(&s->
pb
,
199
ff_msmp4_mb_i_table
[coded_cbp][1],
ff_msmp4_mb_i_table
[coded_cbp][0]);
200
}
else
{
201
put_bits
(&s->
pb
,
202
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][1],
203
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][0]);
204
}
205
put_bits
(&s->
pb
, 1, 0);
/* no AC prediction yet */
206
if
(s->
inter_intra_pred
){
207
s->
h263_aic_dir
=0;
208
put_bits
(&s->
pb
,
ff_table_inter_intra
[s->
h263_aic_dir
][1],
ff_table_inter_intra
[s->
h263_aic_dir
][0]);
209
}
210
s->
misc_bits
+=
get_bits_diff
(s);
211
}
212
213
for
(i = 0; i < 6; i++) {
214
ff_msmpeg4_encode_block
(s, block[i], i);
215
}
216
if
(s->
mb_intra
)
217
s->
i_tex_bits
+=
get_bits_diff
(s);
218
else
219
s->
p_tex_bits
+=
get_bits_diff
(s);
220
}
221
222
AVCodec
ff_wmv2_encoder
= {
223
.
name
=
"wmv2"
,
224
.long_name =
NULL_IF_CONFIG_SMALL
(
"Windows Media Video 8"
),
225
.type =
AVMEDIA_TYPE_VIDEO
,
226
.id =
AV_CODEC_ID_WMV2
,
227
.priv_data_size =
sizeof
(
Wmv2Context
),
228
.
init
=
wmv2_encode_init
,
229
.encode2 =
ff_MPV_encode_picture
,
230
.
close
=
ff_MPV_encode_end
,
231
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
232
};
Generated on Sun Jul 20 2014 23:05:58 for FFmpeg by
1.8.2