comparison utils.c @ 903:22ee74da2cd3 libavcodec

cleanup adding AVVideoFrame moving quality, pict_type, key_frame, qscale_table, ... to AVVideoFrame removing obsolete variables in AVCodecContext skiping of MBs in b frames correctly initalizing AVCodecContext picture buffer cleanup
author michaelni
date Wed, 04 Dec 2002 10:04:03 +0000
parents 6acc8394960d
children 2ac4caad5ca6
comparison
equal deleted inserted replaced
902:6acc8394960d 903:22ee74da2cd3
84 while (*p != NULL) p = &(*p)->next; 84 while (*p != NULL) p = &(*p)->next;
85 *p = format; 85 *p = format;
86 format->next = NULL; 86 format->next = NULL;
87 } 87 }
88 88
89 void avcodec_get_chroma_sub_sample(int fmt, int *h_shift, int *v_shift){
90 switch(fmt){
91 case PIX_FMT_YUV410P:
92 *h_shift=2;
93 *v_shift=2;
94 break;
95 case PIX_FMT_YUV420P:
96 *h_shift=1;
97 *v_shift=1;
98 break;
99 case PIX_FMT_YUV411P:
100 *h_shift=2;
101 *v_shift=0;
102 break;
103 case PIX_FMT_YUV422P:
104 case PIX_FMT_YUV422:
105 *h_shift=1;
106 *v_shift=0;
107 break;
108 default: //RGB/...
109 *h_shift=0;
110 *v_shift=0;
111 break;
112 }
113 }
114
115 typedef struct DefaultPicOpaque{
116 int last_pic_num;
117 uint8_t *data[4];
118 }DefaultPicOpaque;
119
120 int avcodec_default_get_buffer(AVCodecContext *s, AVVideoFrame *pic){
121 int i;
122 const int width = s->width;
123 const int height= s->height;
124 DefaultPicOpaque *opaque;
125
126 if(pic->opaque){
127 opaque= (DefaultPicOpaque *)pic->opaque;
128 for(i=0; i<3; i++)
129 pic->data[i]= opaque->data[i];
130
131 // printf("get_buffer %X coded_pic_num:%d last:%d\n", pic->opaque, pic->coded_picture_number, opaque->last_pic_num);
132 pic->age= pic->coded_picture_number - opaque->last_pic_num;
133 opaque->last_pic_num= pic->coded_picture_number;
134 //printf("age: %d %d %d\n", pic->age, c->picture_number, pic->coded_picture_number);
135 }else{
136 int align, h_chroma_shift, v_chroma_shift;
137 int w, h, pixel_size;
138
139 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
140
141 switch(s->pix_fmt){
142 case PIX_FMT_YUV422:
143 pixel_size=2;
144 break;
145 case PIX_FMT_RGB24:
146 case PIX_FMT_BGR24:
147 pixel_size=3;
148 break;
149 case PIX_FMT_BGRA32:
150 case PIX_FMT_RGBA32:
151 pixel_size=4;
152 break;
153 default:
154 pixel_size=1;
155 }
156
157 if(s->codec_id==CODEC_ID_SVQ1) align=63;
158 else align=15;
159
160 w= (width +align)&~align;
161 h= (height+align)&~align;
162
163 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
164 w+= EDGE_WIDTH*2;
165 h+= EDGE_WIDTH*2;
166 }
167
168 opaque= av_mallocz(sizeof(DefaultPicOpaque));
169 if(opaque==NULL) return -1;
170
171 pic->opaque= opaque;
172 opaque->last_pic_num= -256*256*256*64;
173
174 for(i=0; i<3; i++){
175 int h_shift= i==0 ? 0 : h_chroma_shift;
176 int v_shift= i==0 ? 0 : v_chroma_shift;
177
178 pic->linesize[i]= pixel_size*w>>h_shift;
179
180 pic->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16
181 if(pic->base[i]==NULL) return -1;
182
183 memset(pic->base[i], 128, pic->linesize[i]*h>>v_shift);
184
185 if(s->flags&CODEC_FLAG_EMU_EDGE)
186 pic->data[i] = pic->base[i];
187 else
188 pic->data[i] = pic->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift);
189
190 opaque->data[i]= pic->data[i];
191 }
192 pic->age= 256*256*256*64;
193 }
194
195 return 0;
196 }
197
198 void avcodec_default_release_buffer(AVCodecContext *s, AVVideoFrame *pic){
199 int i;
200
201 for(i=0; i<3; i++)
202 pic->data[i]=NULL;
203 //printf("R%X\n", pic->opaque);
204 }
205
89 void avcodec_get_context_defaults(AVCodecContext *s){ 206 void avcodec_get_context_defaults(AVCodecContext *s){
90 s->bit_rate= 800*1000; 207 s->bit_rate= 800*1000;
91 s->bit_rate_tolerance= s->bit_rate*10; 208 s->bit_rate_tolerance= s->bit_rate*10;
92 s->qmin= 2; 209 s->qmin= 2;
93 s->qmax= 31; 210 s->qmax= 31;
102 s->error_resilience= 1; 219 s->error_resilience= 1;
103 s->workaround_bugs= FF_BUG_AUTODETECT; 220 s->workaround_bugs= FF_BUG_AUTODETECT;
104 s->frame_rate = 25 * FRAME_RATE_BASE; 221 s->frame_rate = 25 * FRAME_RATE_BASE;
105 s->gop_size= 50; 222 s->gop_size= 50;
106 s->me_method= ME_EPZS; 223 s->me_method= ME_EPZS;
224 s->get_buffer= avcodec_default_get_buffer;
225 s->release_buffer= avcodec_default_release_buffer;
107 } 226 }
108 227
109 /** 228 /**
110 * allocates a AVCodecContext and set it to defaults. 229 * allocates a AVCodecContext and set it to defaults.
111 * this can be deallocated by simply calling free() 230 * this can be deallocated by simply calling free()
116 if(avctx==NULL) return NULL; 235 if(avctx==NULL) return NULL;
117 236
118 avcodec_get_context_defaults(avctx); 237 avcodec_get_context_defaults(avctx);
119 238
120 return avctx; 239 return avctx;
240 }
241
242 /**
243 * allocates a AVPicture and set it to defaults.
244 * this can be deallocated by simply calling free()
245 */
246 AVVideoFrame *avcodec_alloc_picture(void){
247 AVVideoFrame *pic= av_mallocz(sizeof(AVVideoFrame));
248
249 return pic;
121 } 250 }
122 251
123 int avcodec_open(AVCodecContext *avctx, AVCodec *codec) 252 int avcodec_open(AVCodecContext *avctx, AVCodec *codec)
124 { 253 {
125 int ret; 254 int ret;
150 avctx->frame_number++; 279 avctx->frame_number++;
151 return ret; 280 return ret;
152 } 281 }
153 282
154 int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size, 283 int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size,
155 const AVPicture *pict) 284 const AVVideoFrame *pict)
156 { 285 {
157 int ret; 286 int ret;
158 287
159 ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict); 288 ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict);
160 289
165 } 294 }
166 295
167 /* decode a frame. return -1 if error, otherwise return the number of 296 /* decode a frame. return -1 if error, otherwise return the number of
168 bytes used. If no frame could be decompressed, *got_picture_ptr is 297 bytes used. If no frame could be decompressed, *got_picture_ptr is
169 zero. Otherwise, it is non zero */ 298 zero. Otherwise, it is non zero */
170 int avcodec_decode_video(AVCodecContext *avctx, AVPicture *picture, 299 int avcodec_decode_video(AVCodecContext *avctx, AVVideoFrame *picture,
171 int *got_picture_ptr, 300 int *got_picture_ptr,
172 UINT8 *buf, int buf_size) 301 UINT8 *buf, int buf_size)
173 { 302 {
174 int ret; 303 int ret;
175 304
176 ret = avctx->codec->decode(avctx, picture, got_picture_ptr, 305 ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
177 buf, buf_size); 306 buf, buf_size);
178 307
179 emms_c(); //needed to avoid a emms_c() call before every return; 308 emms_c(); //needed to avoid a emms_c() call before every return;
180 309
181 if (*got_picture_ptr) 310 if (*got_picture_ptr)
182 avctx->frame_number++; 311 avctx->frame_number++;
183 return ret; 312 return ret;
184 } 313 }
185 314