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