annotate wmv2enc.c @ 10952:ea8f891d997d libavcodec

H264 DXVA2 implementation It allows VLD H264 decoding using DXVA2 (GPU assisted decoding API under VISTA and Windows 7). It is implemented by using AVHWAccel API. It has been tested successfully for some time in VLC using an nvidia card on Windows 7. To compile it, you need to have the system header dxva2api.h (either from microsoft or using http://downloads.videolan.org/pub/videolan/testing/contrib/dxva2api.h) The generated libavcodec.dll does not depend directly on any new lib as the necessary objects are given by the application using FFmpeg.
author fenrir
date Wed, 20 Jan 2010 18:54:51 +0000
parents d0657e337f91
children 8a4984c5cacc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
1 /*
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 7040
diff changeset
2 * Copyright (c) 2002 The FFmpeg Project
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
3 *
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
4 * This file is part of FFmpeg.
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
5 *
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
10 *
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
14 * Lesser General Public License for more details.
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
15 *
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
19 */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
20
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
21 #include "avcodec.h"
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
22 #include "dsputil.h"
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
23 #include "mpegvideo.h"
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
24 #include "msmpeg4.h"
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
25 #include "msmpeg4data.h"
10828
d0657e337f91 Split H263 encoder and decoder from common code.
michael
parents: 10146
diff changeset
26 #include "h263.h"
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
27 #include "wmv2.h"
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
28
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
29
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
30 static int encode_ext_header(Wmv2Context *w){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
31 MpegEncContext * const s= &w->s;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
32 PutBitContext pb;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
33 int code;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
34
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
35 init_put_bits(&pb, s->avctx->extradata, s->avctx->extradata_size);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
36
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
37 put_bits(&pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
38 put_bits(&pb, 11, FFMIN(s->bit_rate/1024, 2047));
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
39
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
40 put_bits(&pb, 1, w->mspel_bit=1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
41 put_bits(&pb, 1, s->loop_filter);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
42 put_bits(&pb, 1, w->abt_flag=1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
43 put_bits(&pb, 1, w->j_type_bit=1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
44 put_bits(&pb, 1, w->top_left_mv_flag=0);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
45 put_bits(&pb, 1, w->per_mb_rl_bit=1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
46 put_bits(&pb, 3, code=1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
47
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
48 flush_put_bits(&pb);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
49
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
50 s->slice_height = s->mb_height / code;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
51
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
52 return 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
53 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
54
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
55 static av_cold int wmv2_encode_init(AVCodecContext *avctx){
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
56 Wmv2Context * const w= avctx->priv_data;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
57
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
58 if(MPV_encode_init(avctx) < 0)
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
59 return -1;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
60
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
61 ff_wmv2_common_init(w);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
62
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
63 avctx->extradata_size= 4;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
64 avctx->extradata= av_mallocz(avctx->extradata_size + 10);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
65 encode_ext_header(w);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
66
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
67 return 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
68 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
69
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
70 int ff_wmv2_encode_picture_header(MpegEncContext * s, int picture_number)
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
71 {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
72 Wmv2Context * const w= (Wmv2Context*)s;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
73
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
74 put_bits(&s->pb, 1, s->pict_type - 1);
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5939
diff changeset
75 if(s->pict_type == FF_I_TYPE){
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
76 put_bits(&s->pb, 7, 0);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
77 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
78 put_bits(&s->pb, 5, s->qscale);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
79
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
80 s->dc_table_index = 1;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
81 s->mv_table_index = 1; /* only if P frame */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
82 s->per_mb_rl_table = 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
83 s->mspel= 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
84 w->per_mb_abt=0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
85 w->abt_type=0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
86 w->j_type=0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
87
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
88 assert(s->flipflop_rounding);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
89
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5939
diff changeset
90 if (s->pict_type == FF_I_TYPE) {
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
91 assert(s->no_rounding==1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
92 if(w->j_type_bit) put_bits(&s->pb, 1, w->j_type);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
93
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
94 if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
95
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
96 if(!s->per_mb_rl_table){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
97 ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
98 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
99 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
100
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
101 put_bits(&s->pb, 1, s->dc_table_index);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
102
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
103 s->inter_intra_pred= 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
104 }else{
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
105 int cbp_index;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
106
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
107 put_bits(&s->pb, 2, SKIP_TYPE_NONE);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
108
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
109 ff_msmpeg4_code012(&s->pb, cbp_index=0);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
110 if(s->qscale <= 10){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
111 int map[3]= {0,2,1};
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
112 w->cbp_table_index= map[cbp_index];
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
113 }else if(s->qscale <= 20){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
114 int map[3]= {1,0,2};
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
115 w->cbp_table_index= map[cbp_index];
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
116 }else{
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
117 int map[3]= {2,1,0};
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
118 w->cbp_table_index= map[cbp_index];
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
119 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
120
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
121 if(w->mspel_bit) put_bits(&s->pb, 1, s->mspel);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
122
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
123 if(w->abt_flag){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
124 put_bits(&s->pb, 1, w->per_mb_abt^1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
125 if(!w->per_mb_abt){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
126 ff_msmpeg4_code012(&s->pb, w->abt_type);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
127 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
128 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
129
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
130 if(w->per_mb_rl_bit) put_bits(&s->pb, 1, s->per_mb_rl_table);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
131
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
132 if(!s->per_mb_rl_table){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
133 ff_msmpeg4_code012(&s->pb, s->rl_table_index);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
134 s->rl_chroma_table_index = s->rl_table_index;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
135 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
136 put_bits(&s->pb, 1, s->dc_table_index);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
137 put_bits(&s->pb, 1, s->mv_table_index);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
138
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
139 s->inter_intra_pred= 0;//(s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
140 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
141 s->esc3_level_length= 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
142 s->esc3_run_length= 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
143
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
144 return 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
145 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
146
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
147 /* Nearly identical to wmv1 but that is just because we do not use the
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
148 * useless M$ crap features. It is duplicated here in case someone wants
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
149 * to add support for these crap features. */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
150 void ff_wmv2_encode_mb(MpegEncContext * s,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
151 DCTELEM block[6][64],
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
152 int motion_x, int motion_y)
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
153 {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
154 Wmv2Context * const w= (Wmv2Context*)s;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
155 int cbp, coded_cbp, i;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
156 int pred_x, pred_y;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
157 uint8_t *coded_block;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
158
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
159 ff_msmpeg4_handle_slices(s);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
160
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
161 if (!s->mb_intra) {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
162 /* compute cbp */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
163 cbp = 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
164 for (i = 0; i < 6; i++) {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
165 if (s->block_last_index[i] >= 0)
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
166 cbp |= 1 << (5 - i);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
167 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
168
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
169 put_bits(&s->pb,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
170 wmv2_inter_table[w->cbp_table_index][cbp + 64][1],
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
171 wmv2_inter_table[w->cbp_table_index][cbp + 64][0]);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
172
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
173 /* motion vector */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
174 h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
175 ff_msmpeg4_encode_motion(s, motion_x - pred_x,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
176 motion_y - pred_y);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
177 } else {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
178 /* compute cbp */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
179 cbp = 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
180 coded_cbp = 0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
181 for (i = 0; i < 6; i++) {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
182 int val, pred;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
183 val = (s->block_last_index[i] >= 1);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
184 cbp |= val << (5 - i);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
185 if (i < 4) {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
186 /* predict value for close blocks only for luma */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
187 pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
188 *coded_block = val;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
189 val = val ^ pred;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
190 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
191 coded_cbp |= val << (5 - i);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
192 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
193
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5939
diff changeset
194 if (s->pict_type == FF_I_TYPE) {
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
195 put_bits(&s->pb,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
196 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
197 } else {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
198 put_bits(&s->pb,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
199 wmv2_inter_table[w->cbp_table_index][cbp][1],
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
200 wmv2_inter_table[w->cbp_table_index][cbp][0]);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
201 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
202 put_bits(&s->pb, 1, 0); /* no AC prediction yet */
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
203 if(s->inter_intra_pred){
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
204 s->h263_aic_dir=0;
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
205 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
206 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
207 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
208
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
209 for (i = 0; i < 6; i++) {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
210 ff_msmpeg4_encode_block(s, block[i], i);
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
211 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
212 }
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
213
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
214 AVCodec wmv2_encoder = {
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
215 "wmv2",
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
216 CODEC_TYPE_VIDEO,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
217 CODEC_ID_WMV2,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
218 sizeof(Wmv2Context),
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
219 wmv2_encode_init,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
220 MPV_encode_picture,
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
221 MPV_encode_end,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 10038
diff changeset
222 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6788
diff changeset
223 .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),
5939
b47573cb7401 split wmv2 encoder and decoder in their own files
aurel
parents:
diff changeset
224 };