Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6148 | serge | 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 | .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"), |
||
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 | };>><>>><>>><>>=II_BITRATE); |