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
/* motion vector */
173
ff_h263_pred_motion
(s, 0, 0, &pred_x, &pred_y);
174
ff_msmpeg4_encode_motion
(s, motion_x - pred_x,
175
motion_y - pred_y);
176
}
else
{
177
/* compute cbp */
178
cbp = 0;
179
coded_cbp = 0;
180
for
(i = 0; i < 6; i++) {
181
int
val
,
pred
;
182
val = (s->
block_last_index
[i] >= 1);
183
cbp |= val << (5 - i);
184
if
(i < 4) {
185
/* predict value for close blocks only for luma */
186
pred =
ff_msmpeg4_coded_block_pred
(s, i, &coded_block);
187
*coded_block =
val
;
188
val = val ^
pred
;
189
}
190
coded_cbp |= val << (5 - i);
191
}
192
193
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
194
put_bits
(&s->
pb
,
195
ff_msmp4_mb_i_table
[coded_cbp][1],
ff_msmp4_mb_i_table
[coded_cbp][0]);
196
}
else
{
197
put_bits
(&s->
pb
,
198
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][1],
199
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][0]);
200
}
201
put_bits
(&s->
pb
, 1, 0);
/* no AC prediction yet */
202
if
(s->
inter_intra_pred
){
203
s->
h263_aic_dir
=0;
204
put_bits
(&s->
pb
,
ff_table_inter_intra
[s->
h263_aic_dir
][1],
ff_table_inter_intra
[s->
h263_aic_dir
][0]);
205
}
206
}
207
208
for
(i = 0; i < 6; i++) {
209
ff_msmpeg4_encode_block
(s, block[i], i);
210
}
211
}
212
213
AVCodec
ff_wmv2_encoder
= {
214
.
name
=
"wmv2"
,
215
.type =
AVMEDIA_TYPE_VIDEO
,
216
.id =
AV_CODEC_ID_WMV2
,
217
.priv_data_size =
sizeof
(
Wmv2Context
),
218
.
init
=
wmv2_encode_init
,
219
.encode2 =
ff_MPV_encode_picture
,
220
.
close
=
ff_MPV_encode_end
,
221
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
222
.long_name =
NULL_IF_CONFIG_SMALL
(
"Windows Media Video 8"
),
223
};
Generated on Wed Jul 10 2013 23:48:07 for FFmpeg by
1.8.2