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