FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
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 "
dsputil.h
"
23
#include "
mpegvideo.h
"
24
#include "
msmpeg4.h
"
25
#include "
msmpeg4data.h
"
26
#include "
h263.h
"
27
#include "
wmv2.h
"
28
29
30
static
int
encode_ext_header
(
Wmv2Context
*w){
31
MpegEncContext
*
const
s= &w->
s
;
32
PutBitContext
pb;
33
int
code;
34
35
init_put_bits
(&pb, s->
avctx
->
extradata
, s->
avctx
->
extradata_size
);
36
37
put_bits
(&pb, 5, s->
avctx
->
time_base
.
den
/ s->
avctx
->
time_base
.
num
);
//yes 29.97 -> 29
38
put_bits
(&pb, 11,
FFMIN
(s->
bit_rate
/1024, 2047));
39
40
put_bits
(&pb, 1, w->
mspel_bit
=1);
41
put_bits
(&pb, 1, s->
loop_filter
);
42
put_bits
(&pb, 1, w->
abt_flag
=1);
43
put_bits
(&pb, 1, w->
j_type_bit
=1);
44
put_bits
(&pb, 1, w->
top_left_mv_flag
=0);
45
put_bits
(&pb, 1, w->
per_mb_rl_bit
=1);
46
put_bits
(&pb, 3, code=1);
47
48
flush_put_bits
(&pb);
49
50
s->
slice_height
= s->
mb_height
/ code;
51
52
return
0;
53
}
54
55
static
av_cold
int
wmv2_encode_init
(
AVCodecContext
*avctx){
56
Wmv2Context
*
const
w= avctx->
priv_data
;
57
58
if
(
ff_MPV_encode_init
(avctx) < 0)
59
return
-1;
60
61
ff_wmv2_common_init
(w);
62
63
avctx->
extradata_size
= 4;
64
avctx->
extradata
=
av_mallocz
(avctx->
extradata_size
+ 10);
65
encode_ext_header
(w);
66
67
return
0;
68
}
69
70
int
ff_wmv2_encode_picture_header
(
MpegEncContext
* s,
int
picture_number)
71
{
72
Wmv2Context
*
const
w= (
Wmv2Context
*)s;
73
74
put_bits
(&s->
pb
, 1, s->
pict_type
- 1);
75
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
){
76
put_bits
(&s->
pb
, 7, 0);
77
}
78
put_bits
(&s->
pb
, 5, s->
qscale
);
79
80
s->
dc_table_index
= 1;
81
s->
mv_table_index
= 1;
/* only if P frame */
82
s->
per_mb_rl_table
= 0;
83
s->
mspel
= 0;
84
w->
per_mb_abt
=0;
85
w->
abt_type
=0;
86
w->
j_type
=0;
87
88
av_assert0
(s->
flipflop_rounding
);
89
90
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
91
av_assert0
(s->
no_rounding
==1);
92
if
(w->
j_type_bit
)
put_bits
(&s->
pb
, 1, w->
j_type
);
93
94
if
(w->
per_mb_rl_bit
)
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
95
96
if
(!s->
per_mb_rl_table
){
97
ff_msmpeg4_code012
(&s->
pb
, s->
rl_chroma_table_index
);
98
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
99
}
100
101
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
102
103
s->
inter_intra_pred
= 0;
104
}
else
{
105
int
cbp_index;
106
107
put_bits
(&s->
pb
, 2,
SKIP_TYPE_NONE
);
108
109
ff_msmpeg4_code012
(&s->
pb
, cbp_index=0);
110
if
(s->
qscale
<= 10){
111
int
map[3]= {0,2,1};
112
w->
cbp_table_index
= map[cbp_index];
113
}
else
if
(s->
qscale
<= 20){
114
int
map[3]= {1,0,2};
115
w->
cbp_table_index
= map[cbp_index];
116
}
else
{
117
int
map[3]= {2,1,0};
118
w->
cbp_table_index
= map[cbp_index];
119
}
120
121
if
(w->
mspel_bit
)
put_bits
(&s->
pb
, 1, s->
mspel
);
122
123
if
(w->
abt_flag
){
124
put_bits
(&s->
pb
, 1, w->
per_mb_abt
^1);
125
if
(!w->
per_mb_abt
){
126
ff_msmpeg4_code012
(&s->
pb
, w->
abt_type
);
127
}
128
}
129
130
if
(w->
per_mb_rl_bit
)
put_bits
(&s->
pb
, 1, s->
per_mb_rl_table
);
131
132
if
(!s->
per_mb_rl_table
){
133
ff_msmpeg4_code012
(&s->
pb
, s->
rl_table_index
);
134
s->
rl_chroma_table_index
= s->
rl_table_index
;
135
}
136
put_bits
(&s->
pb
, 1, s->
dc_table_index
);
137
put_bits
(&s->
pb
, 1, s->
mv_table_index
);
138
139
s->
inter_intra_pred
= 0;
//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
140
}
141
s->
esc3_level_length
= 0;
142
s->
esc3_run_length
= 0;
143
144
return
0;
145
}
146
147
/* Nearly identical to wmv1 but that is just because we do not use the
148
* useless M$ crap features. It is duplicated here in case someone wants
149
* to add support for these crap features. */
150
void
ff_wmv2_encode_mb
(
MpegEncContext
* s,
151
DCTELEM
block
[6][64],
152
int
motion_x,
int
motion_y)
153
{
154
Wmv2Context
*
const
w= (
Wmv2Context
*)s;
155
int
cbp, coded_cbp, i;
156
int
pred_x, pred_y;
157
uint8_t
*coded_block;
158
159
ff_msmpeg4_handle_slices
(s);
160
161
if
(!s->
mb_intra
) {
162
/* compute cbp */
163
cbp = 0;
164
for
(i = 0; i < 6; i++) {
165
if
(s->
block_last_index
[i] >= 0)
166
cbp |= 1 << (5 - i);
167
}
168
169
put_bits
(&s->
pb
,
170
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][1],
171
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp + 64][0]);
172
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
}
else
{
178
/* compute cbp */
179
cbp = 0;
180
coded_cbp = 0;
181
for
(i = 0; i < 6; i++) {
182
int
val,
pred
;
183
val = (s->
block_last_index
[i] >= 1);
184
cbp |= val << (5 - i);
185
if
(i < 4) {
186
/* predict value for close blocks only for luma */
187
pred =
ff_msmpeg4_coded_block_pred
(s, i, &coded_block);
188
*coded_block = val;
189
val = val ^
pred
;
190
}
191
coded_cbp |= val << (5 - i);
192
}
193
194
if
(s->
pict_type
==
AV_PICTURE_TYPE_I
) {
195
put_bits
(&s->
pb
,
196
ff_msmp4_mb_i_table
[coded_cbp][1],
ff_msmp4_mb_i_table
[coded_cbp][0]);
197
}
else
{
198
put_bits
(&s->
pb
,
199
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][1],
200
ff_wmv2_inter_table
[w->
cbp_table_index
][cbp][0]);
201
}
202
put_bits
(&s->
pb
, 1, 0);
/* no AC prediction yet */
203
if
(s->
inter_intra_pred
){
204
s->
h263_aic_dir
=0;
205
put_bits
(&s->
pb
,
ff_table_inter_intra
[s->
h263_aic_dir
][1],
ff_table_inter_intra
[s->
h263_aic_dir
][0]);
206
}
207
}
208
209
for
(i = 0; i < 6; i++) {
210
ff_msmpeg4_encode_block
(s, block[i], i);
211
}
212
}
213
214
AVCodec
ff_wmv2_encoder
= {
215
.
name
=
"wmv2"
,
216
.type =
AVMEDIA_TYPE_VIDEO
,
217
.id =
AV_CODEC_ID_WMV2
,
218
.priv_data_size =
sizeof
(
Wmv2Context
),
219
.
init
=
wmv2_encode_init
,
220
.encode2 =
ff_MPV_encode_picture
,
221
.
close
=
ff_MPV_encode_end
,
222
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
223
.long_name =
NULL_IF_CONFIG_SMALL
(
"Windows Media Video 8"
),
224
};
Generated on Sat May 25 2013 03:58:43 for FFmpeg by
1.8.2