() 10l
[libav.git] / libavcodec / utils.c
CommitLineData
de6d9b64
FB
1/*
2 * utils for libavcodec
ff4ec49e 3 * Copyright (c) 2001 Fabrice Bellard.
8f2ab833 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
de6d9b64 5 *
ff4ec49e
FB
6 * This library 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 of the License, or (at your option) any later version.
de6d9b64 10 *
ff4ec49e 11 * This library is distributed in the hope that it will be useful,
de6d9b64 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ff4ec49e
FB
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
de6d9b64 15 *
ff4ec49e
FB
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
5509bffa 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
de6d9b64 19 */
115329f1 20
983e3246
MN
21/**
22 * @file utils.c
23 * utils.
24 */
115329f1 25
de6d9b64 26#include "avcodec.h"
3123dd79 27#include "dsputil.h"
1c2a8c7f 28#include "mpegvideo.h"
4c263142 29#include "integer.h"
6fd46414 30#include "opt.h"
43a80cce 31#include "crc.h"
9b879566 32#include <stdarg.h>
4c263142 33#include <limits.h>
860a40c8 34#include <float.h>
2f30a81d 35#ifdef __MINGW32__
1005f542
CH
36#include <fcntl.h>
37#endif
de6d9b64 38
44608ac7
RG
39const uint8_t ff_reverse[256]={
400x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
410x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
420x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
430x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
440x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
450x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
460x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
470x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
480x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
490x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
500x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
510x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
520x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
530x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
540x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
550x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF,
56};
57
ddebfb15
MN
58static int volatile entangled_thread_counter=0;
59
8e1e6f31
FB
60/**
61 * realloc which does nothing if the block is large enough
62 */
5c91a675 63void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size)
8e1e6f31 64{
115329f1 65 if(min_size < *size)
8e1e6f31 66 return ptr;
115329f1 67
0ecca7a4 68 *size= FFMAX(17*min_size/16 + 32, min_size);
8e1e6f31
FB
69
70 return av_realloc(ptr, *size);
71}
72
855ea723 73static unsigned int last_static = 0;
8d1f2ba5
MN
74static unsigned int allocated_static = 0;
75static void** array_static = NULL;
8d1f2ba5
MN
76
77/**
78 * allocation of static arrays - do not use for normal allocation.
79 */
80void *av_mallocz_static(unsigned int size)
855ea723 81{
855ea723 82 void *ptr = av_mallocz(size);
855ea723 83
115329f1 84 if(ptr){
4e39ab4c 85 array_static =av_fast_realloc(array_static, &allocated_static, sizeof(void*)*(last_static+1));
0ecca7a4
MN
86 if(!array_static)
87 return NULL;
8d1f2ba5 88 array_static[last_static++] = ptr;
855ea723 89 }
8d1f2ba5 90
855ea723
ZK
91 return ptr;
92}
8d1f2ba5
MN
93
94/**
073c2593
BP
95 * same as above, but does realloc
96 */
97
98void *av_realloc_static(void *ptr, unsigned int size)
99{
100 int i;
101 if(!ptr)
102 return av_mallocz_static(size);
103 /* Look for the old ptr */
104 for(i = 0; i < last_static; i++) {
105 if(array_static[i] == ptr) {
106 array_static[i] = av_realloc(array_static[i], size);
107 return array_static[i];
108 }
109 }
110 return NULL;
111
112}
113
114/**
8d1f2ba5
MN
115 * free all static arrays and reset pointers to 0.
116 */
4cfbf61b 117void av_free_static(void)
855ea723 118{
8d1f2ba5
MN
119 while(last_static){
120 av_freep(&array_static[--last_static]);
855ea723 121 }
8d1f2ba5 122 av_freep(&array_static);
855ea723
ZK
123}
124
81c5f887 125/**
32fbf33e
BP
126 * Call av_free_static automatically before it's too late
127 */
128
ceaf1909 129static void do_free(void) __attribute__ ((destructor));
32fbf33e 130
ceaf1909 131static void do_free(void)
32fbf33e
BP
132{
133 av_free_static();
134}
135
4d7a0a05 136
de6d9b64 137/* encoder management */
8b69867f 138AVCodec *first_avcodec = NULL;
de6d9b64
FB
139
140void register_avcodec(AVCodec *format)
141{
142 AVCodec **p;
143 p = &first_avcodec;
144 while (*p != NULL) p = &(*p)->next;
145 *p = format;
146 format->next = NULL;
147}
148
21adafec
MN
149void avcodec_set_dimensions(AVCodecContext *s, int width, int height){
150 s->coded_width = width;
151 s->coded_height= height;
152 s->width = -((-width )>>s->lowres);
153 s->height= -((-height)>>s->lowres);
154}
155
d90cf87b 156typedef struct InternalBuffer{
1e491e29 157 int last_pic_num;
d90cf87b 158 uint8_t *base[4];
1e491e29 159 uint8_t *data[4];
237e4938 160 int linesize[4];
d90cf87b
MN
161}InternalBuffer;
162
163#define INTERNAL_BUFFER_SIZE 32
1e491e29 164
f0bbfc4a
MN
165#define ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
166
167void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){
115329f1
DB
168 int w_align= 1;
169 int h_align= 1;
170
f0bbfc4a
MN
171 switch(s->pix_fmt){
172 case PIX_FMT_YUV420P:
173 case PIX_FMT_YUV422:
ebb177dd 174 case PIX_FMT_UYVY422:
f0bbfc4a
MN
175 case PIX_FMT_YUV422P:
176 case PIX_FMT_YUV444P:
177 case PIX_FMT_GRAY8:
178 case PIX_FMT_YUVJ420P:
179 case PIX_FMT_YUVJ422P:
180 case PIX_FMT_YUVJ444P:
181 w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
182 h_align= 16;
183 break;
184 case PIX_FMT_YUV411P:
f02be79d 185 case PIX_FMT_UYVY411:
f0bbfc4a
MN
186 w_align=32;
187 h_align=8;
188 break;
189 case PIX_FMT_YUV410P:
190 if(s->codec_id == CODEC_ID_SVQ1){
191 w_align=64;
192 h_align=64;
193 }
d99fbbf4
RT
194 case PIX_FMT_RGB555:
195 if(s->codec_id == CODEC_ID_RPZA){
196 w_align=4;
197 h_align=4;
198 }
199 case PIX_FMT_PAL8:
200 if(s->codec_id == CODEC_ID_SMC){
201 w_align=4;
202 h_align=4;
203 }
f0bbfc4a 204 break;
c31b8121
RT
205 case PIX_FMT_BGR24:
206 if((s->codec_id == CODEC_ID_MSZH) || (s->codec_id == CODEC_ID_ZLIB)){
207 w_align=4;
208 h_align=4;
209 }
210 break;
f0bbfc4a
MN
211 default:
212 w_align= 1;
213 h_align= 1;
214 break;
215 }
216
217 *width = ALIGN(*width , w_align);
218 *height= ALIGN(*height, h_align);
219}
220
0ecca7a4
MN
221int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h){
222 if((int)w>0 && (int)h>0 && (w+128)*(uint64_t)(h+128) < INT_MAX/4)
223 return 0;
115329f1 224
0ecca7a4
MN
225 av_log(av_log_ctx, AV_LOG_ERROR, "picture size invalid (%ux%u)\n", w, h);
226 return -1;
227}
228
492cd3a9 229int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
1e491e29 230 int i;
f0bbfc4a
MN
231 int w= s->width;
232 int h= s->height;
d90cf87b 233 InternalBuffer *buf;
237e4938 234 int *picture_number;
0ecca7a4 235
4e00e76b 236 assert(pic->data[0]==NULL);
d90cf87b 237 assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count);
1e491e29 238
0ecca7a4
MN
239 if(avcodec_check_dimensions(s,w,h))
240 return -1;
241
d90cf87b
MN
242 if(s->internal_buffer==NULL){
243 s->internal_buffer= av_mallocz(INTERNAL_BUFFER_SIZE*sizeof(InternalBuffer));
244 }
245#if 0
246 s->internal_buffer= av_fast_realloc(
115329f1
DB
247 s->internal_buffer,
248 &s->internal_buffer_size,
d90cf87b
MN
249 sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/
250 );
251#endif
115329f1 252
d90cf87b 253 buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
237e4938
MN
254 picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE-1]).last_pic_num; //FIXME ugly hack
255 (*picture_number)++;
115329f1 256
d90cf87b 257 if(buf->base[0]){
237e4938
MN
258 pic->age= *picture_number - buf->last_pic_num;
259 buf->last_pic_num= *picture_number;
1e491e29 260 }else{
f0bbfc4a 261 int h_chroma_shift, v_chroma_shift;
c7622f9a
MN
262 int pixel_size, size[3];
263 AVPicture picture;
264
1e491e29 265 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
f0bbfc4a
MN
266
267 avcodec_align_dimensions(s, &w, &h);
115329f1 268
1e491e29
MN
269 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
270 w+= EDGE_WIDTH*2;
271 h+= EDGE_WIDTH*2;
272 }
c7622f9a
MN
273 avpicture_fill(&picture, NULL, s->pix_fmt, w, h);
274 pixel_size= picture.linesize[0]*8 / w;
275//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d\n", (int)picture.data[1], w, h, s->pix_fmt);
276 assert(pixel_size>=1);
277 //FIXME next ensures that linesize= 2^x uvlinesize, thats needed because some MC code assumes it
278 if(pixel_size == 3*8)
279 w= ALIGN(w, STRIDE_ALIGN<<h_chroma_shift);
280 else
281 w= ALIGN(pixel_size*w, STRIDE_ALIGN<<(h_chroma_shift+3)) / pixel_size;
282 size[1] = avpicture_fill(&picture, NULL, s->pix_fmt, w, h);
283 size[0] = picture.linesize[0] * h;
284 size[1] -= size[0];
285 if(picture.data[2])
286 size[1]= size[2]= size[1]/2;
287 else
288 size[2]= 0;
289
d90cf87b 290 buf->last_pic_num= -256*256*256*64;
c7622f9a
MN
291 memset(buf->base, 0, sizeof(buf->base));
292 memset(buf->data, 0, sizeof(buf->data));
1e491e29 293
c7622f9a 294 for(i=0; i<3 && size[i]; i++){
2c19981a
MN
295 const int h_shift= i==0 ? 0 : h_chroma_shift;
296 const int v_shift= i==0 ? 0 : v_chroma_shift;
1e491e29 297
c7622f9a 298 buf->linesize[i]= picture.linesize[i];
1e491e29 299
c7622f9a 300 buf->base[i]= av_malloc(size[i]+16); //FIXME 16
d90cf87b 301 if(buf->base[i]==NULL) return -1;
c7622f9a
MN
302 memset(buf->base[i], 128, size[i]);
303
304 // no edge if EDEG EMU or not planar YUV, we check for PAL8 redundantly to protect against a exploitable bug regression ...
115329f1 305 if((s->flags&CODEC_FLAG_EMU_EDGE) || (s->pix_fmt == PIX_FMT_PAL8) || !size[2])
d90cf87b 306 buf->data[i] = buf->base[i];
1e491e29 307 else
3237f731 308 buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), STRIDE_ALIGN);
1e491e29
MN
309 }
310 pic->age= 256*256*256*64;
311 }
237e4938 312 pic->type= FF_BUFFER_TYPE_INTERNAL;
1e491e29 313
d90cf87b
MN
314 for(i=0; i<4; i++){
315 pic->base[i]= buf->base[i];
316 pic->data[i]= buf->data[i];
237e4938 317 pic->linesize[i]= buf->linesize[i];
d90cf87b
MN
318 }
319 s->internal_buffer_count++;
320
1e491e29
MN
321 return 0;
322}
323
492cd3a9 324void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){
1e491e29 325 int i;
d90cf87b
MN
326 InternalBuffer *buf, *last, temp;
327
4e00e76b 328 assert(pic->type==FF_BUFFER_TYPE_INTERNAL);
59c673d5 329 assert(s->internal_buffer_count);
d90cf87b 330
b1609412 331 buf = NULL; /* avoids warning */
d90cf87b
MN
332 for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize
333 buf= &((InternalBuffer*)s->internal_buffer)[i];
334 if(buf->data[0] == pic->data[0])
335 break;
336 }
337 assert(i < s->internal_buffer_count);
338 s->internal_buffer_count--;
339 last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
340
341 temp= *buf;
342 *buf= *last;
343 *last= temp;
344
345 for(i=0; i<3; i++){
1e491e29 346 pic->data[i]=NULL;
d90cf87b
MN
347// pic->base[i]=NULL;
348 }
1e491e29
MN
349//printf("R%X\n", pic->opaque);
350}
351
e1c2a5a0
RT
352int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){
353 AVFrame temp_pic;
354 int i;
355
356 /* If no picture return a new buffer */
357 if(pic->data[0] == NULL) {
358 /* We will copy from buffer, so must be readable */
359 pic->buffer_hints |= FF_BUFFER_HINTS_READABLE;
360 return s->get_buffer(s, pic);
361 }
362
363 /* If internal buffer type return the same buffer */
364 if(pic->type == FF_BUFFER_TYPE_INTERNAL)
365 return 0;
366
367 /*
368 * Not internal type and reget_buffer not overridden, emulate cr buffer
369 */
370 temp_pic = *pic;
371 for(i = 0; i < 4; i++)
372 pic->data[i] = pic->base[i] = NULL;
373 pic->opaque = NULL;
374 /* Allocate new frame */
375 if (s->get_buffer(s, pic))
376 return -1;
377 /* Copy image data from old buffer to new buffer */
378 img_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width,
379 s->height);
380 s->release_buffer(s, &temp_pic); // Release old frame
381 return 0;
382}
383
9c3d33d6
MN
384int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void **arg, int *ret, int count){
385 int i;
386
387 for(i=0; i<count; i++){
388 int r= func(c, arg[i]);
389 if(ret) ret[i]= r;
390 }
391 return 0;
392}
393
494c56d3 394enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt){
a33c7159
MN
395 return fmt[0];
396}
397
43465395
MN
398static const char* context_to_name(void* ptr) {
399 AVCodecContext *avc= ptr;
400
401 if(avc && avc->codec && avc->codec->name)
115329f1 402 return avc->codec->name;
43465395
MN
403 else
404 return "NULL";
405}
406
66acccf0 407#define OFFSET(x) offsetof(AVCodecContext,x)
860a40c8 408#define DEFAULT 0 //should be NAN but it doesnt work as its not a constant in glibc as required by ANSI/ISO C
8bbf6db9
MN
409//these names are too long to be readable
410#define V AV_OPT_FLAG_VIDEO_PARAM
411#define A AV_OPT_FLAG_AUDIO_PARAM
412#define S AV_OPT_FLAG_SUBTITLE_PARAM
115329f1 413#define E AV_OPT_FLAG_ENCODING_PARAM
8bbf6db9 414#define D AV_OPT_FLAG_DECODING_PARAM
860a40c8 415
0b97eea3 416#define AV_CODEC_DEFAULT_BITRATE 200*1000
8c3dd5dc 417
62a05b5b 418static const AVOption options[]={
7df00a4e
PI
419{"b", "set video bitrate (in bits/s)", OFFSET(bit_rate), FF_OPT_TYPE_INT, AV_CODEC_DEFAULT_BITRATE, INT_MIN, INT_MAX, V|A|E},
420{"bt", "set video bitrate tolerance (in bits/s)", OFFSET(bit_rate_tolerance), FF_OPT_TYPE_INT, AV_CODEC_DEFAULT_BITRATE*20, INT_MIN, INT_MAX, V|E},
637b5326 421{"flags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, V|A|E|D, "flags"},
fac862c6
MN
422{"mv4", "use four motion vector by macroblock (mpeg4)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_4MV, INT_MIN, INT_MAX, V|E, "flags"},
423{"obmc", "use overlapped block motion compensation (h263+)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_OBMC, INT_MIN, INT_MAX, V|E, "flags"},
424{"qpel", "use 1/4 pel motion compensation", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_QPEL, INT_MIN, INT_MAX, V|E, "flags"},
425{"loop", "use loop filter", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_LOOP_FILTER, INT_MIN, INT_MAX, V|E, "flags"},
426{"qscale", "use fixed qscale", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_QSCALE, INT_MIN, INT_MAX, 0, "flags"},
427{"gmc", "use gmc", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_GMC, INT_MIN, INT_MAX, V|E, "flags"},
428{"mv0", "always try a mb with mv=<0,0>", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_MV0, INT_MIN, INT_MAX, V|E, "flags"},
429{"part", "use data partitioning", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_PART, INT_MIN, INT_MAX, V|E, "flags"},
430{"input_preserved", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG_INPUT_PRESERVED, INT_MIN, INT_MAX, 0, "flags"},
431{"pass1", "use internal 2pass ratecontrol in first pass mode", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_PASS1, INT_MIN, INT_MAX, 0, "flags"},
432{"pass2", "use internal 2pass ratecontrol in second pass mode", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_PASS2, INT_MIN, INT_MAX, 0, "flags"},
433{"extern_huff", "use external huffman table (for mjpeg)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_EXTERN_HUFF, INT_MIN, INT_MAX, 0, "flags"},
434{"gray", "only decode/encode grayscale", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_GRAY, INT_MIN, INT_MAX, V|E|D, "flags"},
435{"emu_edge", "don't draw edges", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_EMU_EDGE, INT_MIN, INT_MAX, 0, "flags"},
436{"psnr", "error[?] variables will be set during encoding", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_PSNR, INT_MIN, INT_MAX, V|E, "flags"},
437{"truncated", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG_TRUNCATED, INT_MIN, INT_MAX, 0, "flags"},
438{"naq", "normalize adaptive quantization", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_NORMALIZE_AQP, INT_MIN, INT_MAX, V|E, "flags"},
439{"ildct", "use interlaced dct", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_INTERLACED_DCT, INT_MIN, INT_MAX, V|E, "flags"},
440{"low_delay", "force low delay", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_LOW_DELAY, INT_MIN, INT_MAX, V|D, "flags"},
441{"alt", "enable alternate scantable (mpeg2/mpeg4)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_ALT_SCAN, INT_MIN, INT_MAX, V|E, "flags"},
442{"trell", "use trellis quantization", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_TRELLIS_QUANT, INT_MIN, INT_MAX, V|E, "flags"},
443{"global_header", "place global headers in extradata instead of every keyframe", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_GLOBAL_HEADER, INT_MIN, INT_MAX, 0, "flags"},
444{"bitexact", "use only bitexact stuff (except (i)dct)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_BITEXACT, INT_MIN, INT_MAX, A|V|S|D|E, "flags"},
445{"aic", "h263 advanced intra coding / mpeg4 ac prediction", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_AC_PRED, INT_MIN, INT_MAX, V|E, "flags"},
446{"umv", "use unlimited motion vectors", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_H263P_UMV, INT_MIN, INT_MAX, V|E, "flags"},
447{"cbp", "use rate distortion optimization for cbp", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_CBP_RD, INT_MIN, INT_MAX, V|E, "flags"},
8f196b14 448{"qprd", "use rate distortion optimization for qp selection", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_QP_RD, INT_MIN, INT_MAX, V|E, "flags"},
fac862c6
MN
449{"aiv", "h263 alternative inter vlc", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_H263P_AIV, INT_MIN, INT_MAX, V|E, "flags"},
450{"slice", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG_H263P_SLICE_STRUCT, INT_MIN, INT_MAX, V|E, "flags"},
451{"ilme", "interlaced motion estimation", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_INTERLACED_ME, INT_MIN, INT_MAX, V|E, "flags"},
452{"scan_offset", "will reserve space for svcd scan offset user data", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_SVCD_SCAN_OFFSET, INT_MIN, INT_MAX, V|E, "flags"},
8f196b14 453{"cgop", "closed gop", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_CLOSED_GOP, INT_MIN, INT_MAX, V|E, "flags"},
fac862c6
MN
454{"fast", "allow non spec compliant speedup tricks", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_FAST, INT_MIN, INT_MAX, V|E, "flags2"},
455{"sgop", "strictly enforce gop size", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_STRICT_GOP, INT_MIN, INT_MAX, V|E, "flags2"},
456{"noout", "skip bitstream encoding", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_NO_OUTPUT, INT_MIN, INT_MAX, V|E, "flags2"},
457{"local_header", "place global headers at every keyframe instead of in extradata", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_LOCAL_HEADER, INT_MIN, INT_MAX, V|E, "flags2"},
860a40c8 458{"sub_id", NULL, OFFSET(sub_id), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
5cc9b87f 459{"me_method", "set motion estimation method", OFFSET(me_method), FF_OPT_TYPE_INT, ME_EPZS, INT_MIN, INT_MAX, V|E, "me_method"},
860a40c8
MN
460{"extradata_size", NULL, OFFSET(extradata_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
461{"time_base", NULL, OFFSET(time_base), FF_OPT_TYPE_RATIONAL, DEFAULT, INT_MIN, INT_MAX},
7df00a4e 462{"g", "set the group of picture size", OFFSET(gop_size), FF_OPT_TYPE_INT, 12, INT_MIN, INT_MAX, V|E},
860a40c8 463{"rate_emu", NULL, OFFSET(rate_emu), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
7df00a4e
PI
464{"ar", "set audio sampling rate (in Hz)", OFFSET(sample_rate), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
465{"ac", "set number of audio channels", OFFSET(channels), FF_OPT_TYPE_INT, 1, INT_MIN, INT_MAX},
14f0c8e2 466{"cutoff", "set cutoff bandwidth", OFFSET(cutoff), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, A|E},
c6375bf2 467{"frame_size", NULL, OFFSET(frame_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, A|E},
860a40c8
MN
468{"frame_number", NULL, OFFSET(frame_number), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
469{"real_pict_num", NULL, OFFSET(real_pict_num), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
470{"delay", NULL, OFFSET(delay), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
4bef236b
DB
471{"qcomp", "video quantizer scale compression (VBR)", OFFSET(qcompress), FF_OPT_TYPE_FLOAT, 0.5, FLT_MIN, FLT_MAX, V|E},
472{"qblur", "video quantizer scale blur (VBR)", OFFSET(qblur), FF_OPT_TYPE_FLOAT, 0.5, FLT_MIN, FLT_MAX, V|E},
473{"qmin", "min video quantizer scale (VBR)", OFFSET(qmin), FF_OPT_TYPE_INT, 2, 1, 51, V|E},
474{"qmax", "max video quantizer scale (VBR)", OFFSET(qmax), FF_OPT_TYPE_INT, 31, 1, 51, V|E},
475{"qdiff", "max difference between the quantizer scale (VBR)", OFFSET(max_qdiff), FF_OPT_TYPE_INT, 3, INT_MIN, INT_MAX, V|E},
315b0f97 476{"bf", "use 'frames' B frames", OFFSET(max_b_frames), FF_OPT_TYPE_INT, DEFAULT, 0, FF_MAX_B_FRAMES, V|E},
7df00a4e 477{"b_qfactor", "qp factor between p and b frames", OFFSET(b_quant_factor), FF_OPT_TYPE_FLOAT, 1.25, FLT_MIN, FLT_MAX, V|E},
8bbf6db9 478{"rc_strategy", NULL, OFFSET(rc_strategy), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
c9ab8df8 479{"b_strategy", NULL, OFFSET(b_frame_strategy), FF_OPT_TYPE_INT, 0, INT_MIN, INT_MAX, V|E},
8bbf6db9 480{"hurry_up", NULL, OFFSET(hurry_up), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D},
860a40c8
MN
481{"rtp_mode", NULL, OFFSET(rtp_mode), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
482{"rtp_payload_size", NULL, OFFSET(rtp_payload_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
483{"mv_bits", NULL, OFFSET(mv_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
484{"header_bits", NULL, OFFSET(header_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
485{"i_tex_bits", NULL, OFFSET(i_tex_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
486{"p_tex_bits", NULL, OFFSET(p_tex_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
487{"i_count", NULL, OFFSET(i_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
488{"p_count", NULL, OFFSET(p_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
489{"skip_count", NULL, OFFSET(skip_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
490{"misc_bits", NULL, OFFSET(misc_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
491{"frame_bits", NULL, OFFSET(frame_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
492{"codec_tag", NULL, OFFSET(codec_tag), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
7df00a4e 493{"bug", "workaround not auto detected encoder bugs", OFFSET(workaround_bugs), FF_OPT_TYPE_FLAGS, FF_BUG_AUTODETECT, INT_MIN, INT_MAX, V|D, "bug"},
fac862c6
MN
494{"autodetect", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_AUTODETECT, INT_MIN, INT_MAX, V|D, "bug"},
495{"old_msmpeg4", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_OLD_MSMPEG4, INT_MIN, INT_MAX, V|D, "bug"},
496{"xvid_ilace", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_XVID_ILACE, INT_MIN, INT_MAX, V|D, "bug"},
497{"ump4", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_UMP4, INT_MIN, INT_MAX, V|D, "bug"},
498{"no_padding", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_NO_PADDING, INT_MIN, INT_MAX, V|D, "bug"},
499{"amv", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_AMV, INT_MIN, INT_MAX, V|D, "bug"},
500{"ac_vlc", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_AC_VLC, INT_MIN, INT_MAX, V|D, "bug"},
501{"qpel_chroma", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_QPEL_CHROMA, INT_MIN, INT_MAX, V|D, "bug"},
502{"std_qpel", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_STD_QPEL, INT_MIN, INT_MAX, V|D, "bug"},
503{"qpel_chroma2", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_QPEL_CHROMA2, INT_MIN, INT_MAX, V|D, "bug"},
504{"direct_blocksize", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_DIRECT_BLOCKSIZE, INT_MIN, INT_MAX, V|D, "bug"},
505{"edge", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_EDGE, INT_MIN, INT_MAX, V|D, "bug"},
506{"hpel_chroma", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_HPEL_CHROMA, INT_MIN, INT_MAX, V|D, "bug"},
507{"dc_clip", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_DC_CLIP, INT_MIN, INT_MAX, V|D, "bug"},
508{"ms", NULL, 0, FF_OPT_TYPE_CONST, FF_BUG_MS, INT_MIN, INT_MAX, V|D, "bug"},
509{"lelim", "single coefficient elimination threshold for luminance (negative values also consider dc coefficient)", OFFSET(luma_elim_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
510{"celim", "single coefficient elimination threshold for chrominance (negative values also consider dc coefficient)", OFFSET(chroma_elim_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
5cc9b87f 511{"strict", "how strictly to follow the standards", OFFSET(strict_std_compliance), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "strict"},
fac862c6
MN
512{"very", NULL, 0, FF_OPT_TYPE_CONST, FF_COMPLIANCE_VERY_STRICT, INT_MIN, INT_MAX, V|E, "strict"},
513{"strict", NULL, 0, FF_OPT_TYPE_CONST, FF_COMPLIANCE_STRICT, INT_MIN, INT_MAX, V|E, "strict"},
514{"normal", NULL, 0, FF_OPT_TYPE_CONST, FF_COMPLIANCE_NORMAL, INT_MIN, INT_MAX, V|E, "strict"},
515{"inofficial", NULL, 0, FF_OPT_TYPE_CONST, FF_COMPLIANCE_INOFFICIAL, INT_MIN, INT_MAX, V|E, "strict"},
516{"experimental", NULL, 0, FF_OPT_TYPE_CONST, FF_COMPLIANCE_EXPERIMENTAL, INT_MIN, INT_MAX, V|E, "strict"},
7df00a4e 517{"b_qoffset", "qp offset between p and b frames", OFFSET(b_quant_offset), FF_OPT_TYPE_FLOAT, 1.25, FLT_MIN, FLT_MAX, V|E},
8f196b14 518{"er", NULL, OFFSET(error_resilience), FF_OPT_TYPE_INT, FF_ER_CAREFUL, INT_MIN, INT_MAX, V|D, "er"},
fac862c6
MN
519{"careful", NULL, 0, FF_OPT_TYPE_CONST, FF_ER_CAREFUL, INT_MIN, INT_MAX, V|D, "er"},
520{"compliant", NULL, 0, FF_OPT_TYPE_CONST, FF_ER_COMPLIANT, INT_MIN, INT_MAX, V|D, "er"},
521{"aggressive", NULL, 0, FF_OPT_TYPE_CONST, FF_ER_AGGRESSIVE, INT_MIN, INT_MAX, V|D, "er"},
522{"very_aggressive", NULL, 0, FF_OPT_TYPE_CONST, FF_ER_VERY_AGGRESSIVE, INT_MIN, INT_MAX, V|D, "er"},
860a40c8
MN
523{"has_b_frames", NULL, OFFSET(has_b_frames), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
524{"block_align", NULL, OFFSET(block_align), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
525{"parse_only", NULL, OFFSET(parse_only), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
8bbf6db9 526{"mpeg_quant", NULL, OFFSET(mpeg_quant), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
860a40c8
MN
527{"stats_out", NULL, OFFSET(stats_out), FF_OPT_TYPE_STRING, DEFAULT, CHAR_MIN, CHAR_MAX},
528{"stats_in", NULL, OFFSET(stats_in), FF_OPT_TYPE_STRING, DEFAULT, CHAR_MIN, CHAR_MAX},
4bef236b 529{"qsquish", "how to keep quantizer between qmin and qmax (0 = clip, 1 = use differentiable function)", OFFSET(rc_qsquish), FF_OPT_TYPE_FLOAT, DEFAULT, 0, 99, V|E},
076ce017 530{"rc_qmod_amp", NULL, OFFSET(rc_qmod_amp), FF_OPT_TYPE_FLOAT, DEFAULT, -FLT_MAX, FLT_MAX, V|E},
8bbf6db9 531{"rc_qmod_freq", NULL, OFFSET(rc_qmod_freq), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
860a40c8 532{"rc_override_count", NULL, OFFSET(rc_override_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
5cc9b87f 533{"rc_eq", "set rate control equation", OFFSET(rc_eq), FF_OPT_TYPE_STRING, DEFAULT, CHAR_MIN, CHAR_MAX, V|E},
7df00a4e
PI
534{"maxrate", "set max video bitrate tolerance (in bits/s)", OFFSET(rc_max_rate), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
535{"minrate", "set min video bitrate tolerance (in bits/s)", OFFSET(rc_min_rate), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
536{"bufsize", "set ratecontrol buffer size (in bits)", OFFSET(rc_buffer_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
0b97eea3 537{"rc_buf_aggressivity", NULL, OFFSET(rc_buffer_aggressivity), FF_OPT_TYPE_FLOAT, 1.0, FLT_MIN, FLT_MAX, V|E},
fda7eb90 538{"i_qfactor", "qp factor between p and i frames", OFFSET(i_quant_factor), FF_OPT_TYPE_FLOAT, -0.8, -FLT_MAX, FLT_MAX, V|E},
076ce017
PI
539{"i_qoffset", "qp offset between p and i frames", OFFSET(i_quant_offset), FF_OPT_TYPE_FLOAT, 0.0, -FLT_MAX, FLT_MAX, V|E},
540{"rc_init_cplx", "initial complexity for 1-pass encoding", OFFSET(rc_initial_cplx), FF_OPT_TYPE_FLOAT, DEFAULT, -FLT_MAX, FLT_MAX, V|E},
637b5326 541{"dct", NULL, OFFSET(dct_algo), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, V|E, "dct"},
fac862c6
MN
542{"auto", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_AUTO, INT_MIN, INT_MAX, V|E, "dct"},
543{"fastint", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_FASTINT, INT_MIN, INT_MAX, V|E, "dct"},
544{"int", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_INT, INT_MIN, INT_MAX, V|E, "dct"},
545{"mmx", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_MMX, INT_MIN, INT_MAX, V|E, "dct"},
546{"mlib", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_MLIB, INT_MIN, INT_MAX, V|E, "dct"},
547{"altivec", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_ALTIVEC, INT_MIN, INT_MAX, V|E, "dct"},
548{"faan", NULL, 0, FF_OPT_TYPE_CONST, FF_DCT_FAAN, INT_MIN, INT_MAX, V|E, "dct"},
076ce017
PI
549{"lumi_mask", "lumimasking", OFFSET(lumi_masking), FF_OPT_TYPE_FLOAT, 0, -FLT_MAX, FLT_MAX, V|E},
550{"tcplx_mask", "temporal complexity masking", OFFSET(temporal_cplx_masking), FF_OPT_TYPE_FLOAT, 0, -FLT_MAX, FLT_MAX, V|E},
551{"scplx_mask", "spatial complexity masking", OFFSET(spatial_cplx_masking), FF_OPT_TYPE_FLOAT, 0, -FLT_MAX, FLT_MAX, V|E},
552{"p_mask", "inter masking", OFFSET(p_masking), FF_OPT_TYPE_FLOAT, 0, -FLT_MAX, FLT_MAX, V|E},
553{"dark_mask", "darkness masking", OFFSET(dark_masking), FF_OPT_TYPE_FLOAT, 0, -FLT_MAX, FLT_MAX, V|E},
860a40c8 554{"unused", NULL, OFFSET(unused), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
637b5326 555{"idct", NULL, OFFSET(idct_algo), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, V|E|D, "idct"},
fac862c6
MN
556{"auto", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_AUTO, INT_MIN, INT_MAX, V|E|D, "idct"},
557{"int", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_INT, INT_MIN, INT_MAX, V|E|D, "idct"},
558{"simple", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_SIMPLE, INT_MIN, INT_MAX, V|E|D, "idct"},
559{"simplemmx", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_SIMPLEMMX, INT_MIN, INT_MAX, V|E|D, "idct"},
560{"libmpeg2mmx", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_LIBMPEG2MMX, INT_MIN, INT_MAX, V|E|D, "idct"},
561{"ps2", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_PS2, INT_MIN, INT_MAX, V|E|D, "idct"},
562{"mlib", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_MLIB, INT_MIN, INT_MAX, V|E|D, "idct"},
563{"arm", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_ARM, INT_MIN, INT_MAX, V|E|D, "idct"},
564{"altivec", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_ALTIVEC, INT_MIN, INT_MAX, V|E|D, "idct"},
565{"sh4", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_SH4, INT_MIN, INT_MAX, V|E|D, "idct"},
566{"simplearm", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_SIMPLEARM, INT_MIN, INT_MAX, V|E|D, "idct"},
a0403006 567{"simplearmv5te", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_SIMPLEARMV5TE, INT_MIN, INT_MAX, V|E|D, "idct"},
fac862c6
MN
568{"h264", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_H264, INT_MIN, INT_MAX, V|E|D, "idct"},
569{"vp3", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_VP3, INT_MIN, INT_MAX, V|E|D, "idct"},
570{"ipp", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_IPP, INT_MIN, INT_MAX, V|E|D, "idct"},
571{"xvidmmx", NULL, 0, FF_OPT_TYPE_CONST, FF_IDCT_XVIDMMX, INT_MIN, INT_MAX, V|E|D, "idct"},
860a40c8 572{"slice_count", NULL, OFFSET(slice_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
8f196b14 573{"ec", NULL, OFFSET(error_concealment), FF_OPT_TYPE_FLAGS, 3, INT_MIN, INT_MAX, V|D, "ec"},
fac862c6
MN
574{"guess_mvs", NULL, 0, FF_OPT_TYPE_CONST, FF_EC_GUESS_MVS, INT_MIN, INT_MAX, V|D, "ec"},
575{"deblock", NULL, 0, FF_OPT_TYPE_CONST, FF_EC_DEBLOCK, INT_MIN, INT_MAX, V|D, "ec"},
860a40c8 576{"bits_per_sample", NULL, OFFSET(bits_per_sample), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
8f196b14 577{"pred", "prediction method", OFFSET(prediction_method), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "pred"},
fac862c6
MN
578{"left", NULL, 0, FF_OPT_TYPE_CONST, FF_PRED_LEFT, INT_MIN, INT_MAX, V|E, "pred"},
579{"plane", NULL, 0, FF_OPT_TYPE_CONST, FF_PRED_PLANE, INT_MIN, INT_MAX, V|E, "pred"},
580{"median", NULL, 0, FF_OPT_TYPE_CONST, FF_PRED_MEDIAN, INT_MIN, INT_MAX, V|E, "pred"},
637b5326
MN
581{"aspect", NULL, OFFSET(sample_aspect_ratio), FF_OPT_TYPE_RATIONAL, DEFAULT, 0, 10, V|E},
582{"debug", "print specific debug info", OFFSET(debug), FF_OPT_TYPE_FLAGS, DEFAULT, 0, INT_MAX, V|A|S|E|D, "debug"},
fac862c6
MN
583{"pict", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_PICT_INFO, INT_MIN, INT_MAX, V|D, "debug"},
584{"rc", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_RC, INT_MIN, INT_MAX, V|E, "debug"},
585{"bitstream", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_BITSTREAM, INT_MIN, INT_MAX, V|D, "debug"},
586{"mb_type", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_MB_TYPE, INT_MIN, INT_MAX, V|D, "debug"},
587{"qp", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_QP, INT_MIN, INT_MAX, V|D, "debug"},
588{"mv", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_MV, INT_MIN, INT_MAX, V|D, "debug"},
589{"dct_coeff", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_DCT_COEFF, INT_MIN, INT_MAX, V|D, "debug"},
590{"skip", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_SKIP, INT_MIN, INT_MAX, V|D, "debug"},
591{"startcode", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_STARTCODE, INT_MIN, INT_MAX, V|D, "debug"},
592{"pts", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_PTS, INT_MIN, INT_MAX, V|D, "debug"},
593{"er", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_ER, INT_MIN, INT_MAX, V|D, "debug"},
594{"mmco", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_MMCO, INT_MIN, INT_MAX, V|D, "debug"},
595{"bugs", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_BUGS, INT_MIN, INT_MAX, V|D, "debug"},
596{"vis_qp", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_VIS_QP, INT_MIN, INT_MAX, V|D, "debug"},
597{"vis_mb_type", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_VIS_MB_TYPE, INT_MIN, INT_MAX, V|D, "debug"},
637b5326 598{"vismv", "visualize motion vectors", OFFSET(debug_mv), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, V|D, "debug_mv"},
fac862c6
MN
599{"pf", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_VIS_MV_P_FOR, INT_MIN, INT_MAX, V|D, "debug_mv"},
600{"bf", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_VIS_MV_B_FOR, INT_MIN, INT_MAX, V|D, "debug_mv"},
601{"bb", NULL, 0, FF_OPT_TYPE_CONST, FF_DEBUG_VIS_MV_B_BACK, INT_MIN, INT_MAX, V|D, "debug_mv"},
8bbf6db9
MN
602{"mb_qmin", NULL, OFFSET(mb_qmin), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
603{"mb_qmax", NULL, OFFSET(mb_qmax), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
fac862c6
MN
604{"cmp", "full pel me compare function", OFFSET(me_cmp), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "cmp_func"},
605{"subcmp", "sub pel me compare function", OFFSET(me_sub_cmp), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "cmp_func"},
ec9127c4 606{"mbcmp", "macroblock compare function", OFFSET(mb_cmp), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "cmp_func"},
8c3dd5dc 607{"ildctcmp", "interlaced dct compare function", OFFSET(ildct_cmp), FF_OPT_TYPE_INT, FF_CMP_VSAD, INT_MIN, INT_MAX, V|E, "cmp_func"},
ec9127c4 608{"dia_size", NULL, OFFSET(dia_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
8bbf6db9 609{"last_pred", NULL, OFFSET(last_predictor_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
5cc9b87f 610{"preme", "pre motion estimation", OFFSET(pre_me), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
ec9127c4 611{"precmp", "pre motion estimation compare function", OFFSET(me_pre_cmp), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "cmp_func"},
fac862c6
MN
612{"sad", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_SAD, INT_MIN, INT_MAX, V|E, "cmp_func"},
613{"sse", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_SSE, INT_MIN, INT_MAX, V|E, "cmp_func"},
614{"satd", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_SATD, INT_MIN, INT_MAX, V|E, "cmp_func"},
615{"dct", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_DCT, INT_MIN, INT_MAX, V|E, "cmp_func"},
616{"psnr", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_PSNR, INT_MIN, INT_MAX, V|E, "cmp_func"},
617{"bit", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_BIT, INT_MIN, INT_MAX, V|E, "cmp_func"},
618{"rd", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_RD, INT_MIN, INT_MAX, V|E, "cmp_func"},
619{"zero", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_ZERO, INT_MIN, INT_MAX, V|E, "cmp_func"},
620{"vsad", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_VSAD, INT_MIN, INT_MAX, V|E, "cmp_func"},
621{"vsse", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_VSSE, INT_MIN, INT_MAX, V|E, "cmp_func"},
622{"nsse", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_NSSE, INT_MIN, INT_MAX, V|E, "cmp_func"},
3a6fc8fa 623#ifdef CONFIG_SNOW_ENCODER
fac862c6
MN
624{"w53", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_W53, INT_MIN, INT_MAX, V|E, "cmp_func"},
625{"w97", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_W97, INT_MIN, INT_MAX, V|E, "cmp_func"},
3a6fc8fa 626#endif
fac862c6
MN
627{"dctmax", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_DCTMAX, INT_MIN, INT_MAX, V|E, "cmp_func"},
628{"chroma", NULL, 0, FF_OPT_TYPE_CONST, FF_CMP_CHROMA, INT_MIN, INT_MAX, V|E, "cmp_func"},
8bbf6db9 629{"pre_dia_size", NULL, OFFSET(pre_dia_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
8c3dd5dc 630{"subq", "sub pel motion estimation quality", OFFSET(me_subpel_quality), FF_OPT_TYPE_INT, 8, INT_MIN, INT_MAX, V|E},
860a40c8 631{"dtg_active_format", NULL, OFFSET(dtg_active_format), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
5cc9b87f
PI
632{"me_range", "limit motion vectors range (1023 for DivX player)", OFFSET(me_range), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
633{"ibias", "intra quant bias", OFFSET(intra_quant_bias), FF_OPT_TYPE_INT, FF_DEFAULT_QUANT_BIAS, INT_MIN, INT_MAX, V|E},
634{"pbias", "inter quant bias", OFFSET(inter_quant_bias), FF_OPT_TYPE_INT, FF_DEFAULT_QUANT_BIAS, INT_MIN, INT_MAX, V|E},
860a40c8
MN
635{"color_table_id", NULL, OFFSET(color_table_id), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
636{"internal_buffer_count", NULL, OFFSET(internal_buffer_count), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
637{"global_quality", NULL, OFFSET(global_quality), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
ec9127c4 638{"coder", NULL, OFFSET(coder_type), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "coder"},
8f196b14
MN
639{"vlc", "variable length coder / huffman coder", 0, FF_OPT_TYPE_CONST, FF_CODER_TYPE_VLC, INT_MIN, INT_MAX, V|E, "coder"},
640{"ac", "arithmetic coder", 0, FF_OPT_TYPE_CONST, FF_CODER_TYPE_AC, INT_MIN, INT_MAX, V|E, "coder"},
641{"context", "context model", OFFSET(context_model), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
860a40c8
MN
642{"slice_flags", NULL, OFFSET(slice_flags), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
643{"xvmc_acceleration", NULL, OFFSET(xvmc_acceleration), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
ec9127c4 644{"mbd", NULL, OFFSET(mb_decision), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E, "mbd"},
fac862c6
MN
645{"simple", NULL, 0, FF_OPT_TYPE_CONST, FF_MB_DECISION_SIMPLE, INT_MIN, INT_MAX, V|E, "mbd"},
646{"bits", NULL, 0, FF_OPT_TYPE_CONST, FF_MB_DECISION_BITS, INT_MIN, INT_MAX, V|E, "mbd"},
647{"rd", NULL, 0, FF_OPT_TYPE_CONST, FF_MB_DECISION_RD, INT_MIN, INT_MAX, V|E, "mbd"},
860a40c8 648{"stream_codec_tag", NULL, OFFSET(stream_codec_tag), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
5cc9b87f
PI
649{"sc_threshold", "scene change threshold", OFFSET(scenechange_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
650{"lmin", "min lagrange factor (VBR)", OFFSET(lmin), FF_OPT_TYPE_INT, 2*FF_QP2LAMBDA, 0, INT_MAX, V|E},
651{"lmax", "max lagrange factor (VBR)", OFFSET(lmax), FF_OPT_TYPE_INT, 31*FF_QP2LAMBDA, 0, INT_MAX, V|E},
8f196b14 652{"nr", "noise reduction", OFFSET(noise_reduction), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
8bbf6db9
MN
653{"rc_init_occupancy", NULL, OFFSET(rc_initial_buffer_occupancy), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
654{"inter_threshold", NULL, OFFSET(inter_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
8c3dd5dc 655{"flags2", NULL, OFFSET(flags2), FF_OPT_TYPE_FLAGS, CODEC_FLAG2_FASTPSKIP, INT_MIN, INT_MAX, V|A|E|D, "flags2"},
22565f5d 656{"error", NULL, OFFSET(error_rate), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
ec9127c4 657{"antialias", NULL, OFFSET(antialias_algo), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D, "aa"},
fac862c6
MN
658{"auto", NULL, 0, FF_OPT_TYPE_CONST, FF_AA_AUTO, INT_MIN, INT_MAX, V|D, "aa"},
659{"fastint", NULL, 0, FF_OPT_TYPE_CONST, FF_AA_FASTINT, INT_MIN, INT_MAX, V|D, "aa"},
660{"int", NULL, 0, FF_OPT_TYPE_CONST, FF_AA_INT, INT_MIN, INT_MAX, V|D, "aa"},
661{"float", NULL, 0, FF_OPT_TYPE_CONST, FF_AA_FLOAT, INT_MIN, INT_MAX, V|D, "aa"},
8f196b14 662{"qns", "quantizer noise shaping", OFFSET(quantizer_noise_shaping), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
7df00a4e 663{"threads", NULL, OFFSET(thread_count), FF_OPT_TYPE_INT, 1, INT_MIN, INT_MAX, V|E|D},
637b5326 664{"me_threshold", "motion estimaton threshold", OFFSET(me_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX},
bf080813 665{"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
327409d7 666{"dc", "intra_dc_precision", OFFSET(intra_dc_precision), FF_OPT_TYPE_INT, 0, INT_MIN, INT_MAX, V|E},
8f196b14 667{"nssew", "nsse weight", OFFSET(nsse_weight), FF_OPT_TYPE_INT, 8, INT_MIN, INT_MAX, V|E},
8bbf6db9
MN
668{"skip_top", NULL, OFFSET(skip_top), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D},
669{"skip_bottom", NULL, OFFSET(skip_bottom), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D},
ec9127c4 670{"profile", NULL, OFFSET(profile), FF_OPT_TYPE_INT, FF_PROFILE_UNKNOWN, INT_MIN, INT_MAX, V|A|E, "profile"},
fac862c6 671{"unknown", NULL, 0, FF_OPT_TYPE_CONST, FF_PROFILE_UNKNOWN, INT_MIN, INT_MAX, V|A|E, "profile"},
ec9127c4 672{"level", NULL, OFFSET(level), FF_OPT_TYPE_INT, FF_LEVEL_UNKNOWN, INT_MIN, INT_MAX, V|A|E, "level"},
fac862c6 673{"unknown", NULL, 0, FF_OPT_TYPE_CONST, FF_LEVEL_UNKNOWN, INT_MIN, INT_MAX, V|A|E, "level"},
637b5326 674{"lowres", NULL, OFFSET(lowres), FF_OPT_TYPE_INT, 0, 0, INT_MAX, V|D},
7df00a4e
PI
675{"skip_threshold", "frame skip threshold", OFFSET(frame_skip_threshold), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
676{"skip_factor", "frame skip factor", OFFSET(frame_skip_factor), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
677{"skip_exp", "frame skip exponent", OFFSET(frame_skip_exp), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
d4de20d1 678{"skipcmp", "frame skip compare function", OFFSET(frame_skip_cmp), FF_OPT_TYPE_INT, FF_CMP_DCTMAX, INT_MIN, INT_MAX, V|E, "cmp_func"},
076ce017 679{"border_mask", NULL, OFFSET(border_masking), FF_OPT_TYPE_FLOAT, DEFAULT, -FLT_MAX, FLT_MAX, V|E},
4bef236b
DB
680{"mblmin", "min macroblock quantizer scale (VBR)", OFFSET(mb_lmin), FF_OPT_TYPE_INT, FF_QP2LAMBDA * 2, 1, FF_LAMBDA_MAX, V|E},
681{"mblmax", "max macroblock quantizer scale (VBR)", OFFSET(mb_lmax), FF_OPT_TYPE_INT, FF_QP2LAMBDA * 31, 1, FF_LAMBDA_MAX, V|E},
cccb4c96 682{"mepc", "motion estimation bitrate penalty compensation (1.0 = 256)", OFFSET(me_penalty_compensation), FF_OPT_TYPE_INT, 256, INT_MIN, INT_MAX, V|E},
316a2ec8 683{"bidir_refine", NULL, OFFSET(bidir_refine), FF_OPT_TYPE_INT, DEFAULT, 0, 4, V|E},
e8501c93 684{"brd_scale", NULL, OFFSET(brd_scale), FF_OPT_TYPE_INT, DEFAULT, 0, 10, V|E},
58f7833e 685{"crf", NULL, OFFSET(crf), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
8c3dd5dc
PI
686{"cqp", NULL, OFFSET(cqp), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, V|E},
687{"keyint_min", NULL, OFFSET(keyint_min), FF_OPT_TYPE_INT, 25, INT_MIN, INT_MAX, V|E},
688{"refs", NULL, OFFSET(refs), FF_OPT_TYPE_INT, 1, INT_MIN, INT_MAX, V|E},
58f7833e
RS
689{"chromaoffset", NULL, OFFSET(chromaoffset), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
690{"bframebias", NULL, OFFSET(bframebias), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
696d6889 691{"trellis", NULL, OFFSET(trellis), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|A|E},
8c3dd5dc 692{"directpred", NULL, OFFSET(directpred), FF_OPT_TYPE_INT, 2, INT_MIN, INT_MAX, V|E},
58f7833e
RS
693{"bpyramid", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_BPYRAMID, INT_MIN, INT_MAX, V|E, "flags2"},
694{"wpred", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_WPRED, INT_MIN, INT_MAX, V|E, "flags2"},
695{"mixed_refs", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_MIXED_REFS, INT_MIN, INT_MAX, V|E, "flags2"},
696{"8x8dct", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_8X8DCT, INT_MIN, INT_MAX, V|E, "flags2"},
697{"fastpskip", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_FASTPSKIP, INT_MIN, INT_MAX, V|E, "flags2"},
698{"aud", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_AUD, INT_MIN, INT_MAX, V|E, "flags2"},
699{"brdo", NULL, 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_BRDO, INT_MIN, INT_MAX, V|E, "flags2"},
8c3dd5dc 700{"complexityblur", NULL, OFFSET(complexityblur), FF_OPT_TYPE_FLOAT, 20.0, FLT_MIN, FLT_MAX, V|E},
58f7833e
RS
701{"deblockalpha", NULL, OFFSET(deblockalpha), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
702{"deblockbeta", NULL, OFFSET(deblockbeta), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E},
703{"partitions", NULL, OFFSET(partitions), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, V|E, "partitions"},
704{"parti4x4", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_I4X4, INT_MIN, INT_MAX, V|E, "partitions"},
705{"parti8x8", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_I8X8, INT_MIN, INT_MAX, V|E, "partitions"},
706{"partp4x4", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_P4X4, INT_MIN, INT_MAX, V|E, "partitions"},
707{"partp8x8", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_P8X8, INT_MIN, INT_MAX, V|E, "partitions"},
708{"partb8x8", NULL, 0, FF_OPT_TYPE_CONST, X264_PART_B8X8, INT_MIN, INT_MAX, V|E, "partitions"},
39a64e30 709{"sc_factor", NULL, OFFSET(scenechange_factor), FF_OPT_TYPE_INT, 6, 0, INT_MAX, V|E},
1dd509b1 710{"mv0_threshold", NULL, OFFSET(mv0_threshold), FF_OPT_TYPE_INT, 256, 0, INT_MAX, V|E},
307eb248 711{"ivlc", "intra vlc table", 0, FF_OPT_TYPE_CONST, CODEC_FLAG2_INTRA_VLC, INT_MIN, INT_MAX, V|E, "flags2"},
f9243d34 712{"b_sensitivity", NULL, OFFSET(b_sensitivity), FF_OPT_TYPE_INT, 40, 1, INT_MAX, V|E},
a403fc03
JR
713{"compression_level", NULL, OFFSET(compression_level), FF_OPT_TYPE_INT, FF_COMPRESSION_DEFAULT, INT_MIN, INT_MAX, V|A|E},
714{"use_lpc", NULL, OFFSET(use_lpc), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E},
715{"lpc_coeff_precision", NULL, OFFSET(lpc_coeff_precision), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, A|E},
716{"min_prediction_order", NULL, OFFSET(min_prediction_order), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E},
717{"max_prediction_order", NULL, OFFSET(max_prediction_order), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E},
718{"prediction_order_method", NULL, OFFSET(prediction_order_method), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E},
719{"min_partition_order", NULL, OFFSET(min_partition_order), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E},
720{"max_partition_order", NULL, OFFSET(max_partition_order), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E},
860a40c8
MN
721{NULL},
722};
723
8bbf6db9
MN
724#undef A
725#undef V
5e89b50b
PI
726#undef S
727#undef E
728#undef D
729#undef DEFAULT
8bbf6db9 730
860a40c8 731static AVClass av_codec_context_class = { "AVCodecContext", context_to_name, options };
43465395 732
a949d72e 733void avcodec_get_context_defaults(AVCodecContext *s){
9740beff
MN
734 memset(s, 0, sizeof(AVCodecContext));
735
43465395 736 s->av_class= &av_codec_context_class;
73a8ceaa
PI
737
738 av_opt_set_defaults(s);
739
a949d72e 740 s->rc_eq= "tex^qComp";
c0df9d75 741 s->time_base= (AVRational){0,1};
1e491e29
MN
742 s->get_buffer= avcodec_default_get_buffer;
743 s->release_buffer= avcodec_default_release_buffer;
a33c7159 744 s->get_format= avcodec_default_get_format;
9c3d33d6 745 s->execute= avcodec_default_execute;
5ff85f1d 746 s->sample_aspect_ratio= (AVRational){0,1};
644a9262 747 s->pix_fmt= PIX_FMT_NONE;
1319a77b 748 s->sample_fmt= SAMPLE_FMT_S16; // FIXME: set to NONE
8c3dd5dc 749
2a2bbcb0 750 s->palctrl = NULL;
e1c2a5a0 751 s->reget_buffer= avcodec_default_reget_buffer;
a949d72e
MN
752}
753
754/**
755 * allocates a AVCodecContext and set it to defaults.
115329f1 756 * this can be deallocated by simply calling free()
a949d72e 757 */
7ffbb60e 758AVCodecContext *avcodec_alloc_context(void){
9740beff 759 AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
115329f1 760
a949d72e 761 if(avctx==NULL) return NULL;
115329f1 762
a949d72e 763 avcodec_get_context_defaults(avctx);
115329f1 764
a949d72e
MN
765 return avctx;
766}
767
9740beff
MN
768void avcodec_get_frame_defaults(AVFrame *pic){
769 memset(pic, 0, sizeof(AVFrame));
770
771 pic->pts= AV_NOPTS_VALUE;
c342499d 772 pic->key_frame= 1;
9740beff
MN
773}
774
1e491e29 775/**
492cd3a9 776 * allocates a AVPFrame and set it to defaults.
115329f1 777 * this can be deallocated by simply calling free()
1e491e29 778 */
492cd3a9 779AVFrame *avcodec_alloc_frame(void){
9740beff 780 AVFrame *pic= av_malloc(sizeof(AVFrame));
115329f1 781
9740beff 782 if(pic==NULL) return NULL;
115329f1 783
9740beff 784 avcodec_get_frame_defaults(pic);
115329f1 785
1e491e29
MN
786 return pic;
787}
788
de6d9b64
FB
789int avcodec_open(AVCodecContext *avctx, AVCodec *codec)
790{
ddebfb15 791 int ret= -1;
115329f1 792
ddebfb15
MN
793 entangled_thread_counter++;
794 if(entangled_thread_counter != 1){
795 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
796 goto end;
797 }
de6d9b64 798
09770af8 799 if(avctx->codec)
ddebfb15 800 goto end;
09770af8 801
0edf8a7a
PG
802 if (codec->priv_data_size > 0) {
803 avctx->priv_data = av_mallocz(codec->priv_data_size);
115329f1 804 if (!avctx->priv_data)
ddebfb15 805 goto end;
0edf8a7a
PG
806 } else {
807 avctx->priv_data = NULL;
808 }
21adafec
MN
809
810 if(avctx->coded_width && avctx->coded_height)
811 avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
812 else if(avctx->width && avctx->height)
813 avcodec_set_dimensions(avctx, avctx->width, avctx->height);
814
0ecca7a4
MN
815 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)){
816 av_freep(&avctx->priv_data);
ddebfb15 817 goto end;
0ecca7a4
MN
818 }
819
b5c85991
MN
820 avctx->codec = codec;
821 avctx->codec_id = codec->id;
822 avctx->frame_number = 0;
de6d9b64
FB
823 ret = avctx->codec->init(avctx);
824 if (ret < 0) {
3123dd79 825 av_freep(&avctx->priv_data);
b5c85991 826 avctx->codec= NULL;
ddebfb15 827 goto end;
de6d9b64 828 }
ddebfb15
MN
829 ret=0;
830end:
831 entangled_thread_counter--;
832 return ret;
de6d9b64
FB
833}
834
115329f1 835int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,
de6d9b64
FB
836 const short *samples)
837{
0ecca7a4
MN
838 if(buf_size < FF_MIN_BUFFER_SIZE && 0){
839 av_log(avctx, AV_LOG_ERROR, "buffer smaller then minimum size\n");
840 return -1;
841 }
6f824977
MN
842 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || samples){
843 int ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples);
844 avctx->frame_number++;
845 return ret;
846 }else
847 return 0;
de6d9b64
FB
848}
849
115329f1 850int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
492cd3a9 851 const AVFrame *pict)
de6d9b64 852{
0ecca7a4
MN
853 if(buf_size < FF_MIN_BUFFER_SIZE){
854 av_log(avctx, AV_LOG_ERROR, "buffer smaller then minimum size\n");
855 return -1;
856 }
857 if(avcodec_check_dimensions(avctx,avctx->width,avctx->height))
858 return -1;
6f824977
MN
859 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || pict){
860 int ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict);
861 avctx->frame_number++;
bb628dae 862 emms_c(); //needed to avoid an emms_c() call before every return;
115329f1 863
6f824977
MN
864 return ret;
865 }else
866 return 0;
de6d9b64
FB
867}
868
115329f1 869int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
240c1657
FB
870 const AVSubtitle *sub)
871{
872 int ret;
873 ret = avctx->codec->encode(avctx, buf, buf_size, (void *)sub);
874 avctx->frame_number++;
875 return ret;
876}
877
115329f1
DB
878/**
879 * decode a frame.
f138f883
MN
880 * @param buf bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE larger then the actual read bytes
881 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end
882 * @param buf_size the size of the buffer in bytes
883 * @param got_picture_ptr zero if no frame could be decompressed, Otherwise, it is non zero
884 * @return -1 if error, otherwise return the number of
115329f1 885 * bytes used.
f138f883 886 */
115329f1 887int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
de6d9b64 888 int *got_picture_ptr,
0c1a9eda 889 uint8_t *buf, int buf_size)
de6d9b64
FB
890{
891 int ret;
115329f1 892
53db1cae 893 *got_picture_ptr= 0;
0ecca7a4
MN
894 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height))
895 return -1;
934982c4 896 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
115329f1 897 ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
934982c4 898 buf, buf_size);
6bb925f4 899
bb628dae 900 emms_c(); //needed to avoid an emms_c() call before every return;
115329f1
DB
901
902 if (*got_picture_ptr)
934982c4
MN
903 avctx->frame_number++;
904 }else
905 ret= 0;
906
de6d9b64
FB
907 return ret;
908}
909
910/* decode an audio frame. return -1 if error, otherwise return the
911 *number of bytes used. If no frame could be decompressed,
912 *frame_size_ptr is zero. Otherwise, it is the decompressed frame
913 *size in BYTES. */
115329f1 914int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples,
de6d9b64 915 int *frame_size_ptr,
0c1a9eda 916 uint8_t *buf, int buf_size)
de6d9b64
FB
917{
918 int ret;
919
53db1cae 920 *frame_size_ptr= 0;
fec9ccb7 921 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
115329f1 922 ret = avctx->codec->decode(avctx, samples, frame_size_ptr,
fec9ccb7
MN
923 buf, buf_size);
924 avctx->frame_number++;
925 }else
926 ret= 0;
de6d9b64
FB
927 return ret;
928}
929
240c1657
FB
930/* decode a subtitle message. return -1 if error, otherwise return the
931 *number of bytes used. If no subtitle could be decompressed,
932 *got_sub_ptr is zero. Otherwise, the subtitle is stored in *sub. */
933int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
934 int *got_sub_ptr,
935 const uint8_t *buf, int buf_size)
936{
937 int ret;
938
939 *got_sub_ptr = 0;
115329f1 940 ret = avctx->codec->decode(avctx, sub, got_sub_ptr,
240c1657
FB
941 (uint8_t *)buf, buf_size);
942 if (*got_sub_ptr)
943 avctx->frame_number++;
944 return ret;
945}
946
de6d9b64
FB
947int avcodec_close(AVCodecContext *avctx)
948{
ddebfb15
MN
949 entangled_thread_counter++;
950 if(entangled_thread_counter != 1){
951 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
952 entangled_thread_counter--;
953 return -1;
954 }
955
de6d9b64
FB
956 if (avctx->codec->close)
957 avctx->codec->close(avctx);
eea8c08f 958 avcodec_default_free_buffers(avctx);
3123dd79 959 av_freep(&avctx->priv_data);
de6d9b64 960 avctx->codec = NULL;
ddebfb15 961 entangled_thread_counter--;
de6d9b64
FB
962 return 0;
963}
964
965AVCodec *avcodec_find_encoder(enum CodecID id)
966{
967 AVCodec *p;
968 p = first_avcodec;
969 while (p) {
970 if (p->encode != NULL && p->id == id)
971 return p;
972 p = p->next;
973 }
974 return NULL;
975}
976
98f3b098
A
977AVCodec *avcodec_find_encoder_by_name(const char *name)
978{
979 AVCodec *p;
980 p = first_avcodec;
981 while (p) {
982 if (p->encode != NULL && strcmp(name,p->name) == 0)
983 return p;
984 p = p->next;
985 }
986 return NULL;
987}
988
de6d9b64
FB
989AVCodec *avcodec_find_decoder(enum CodecID id)
990{
991 AVCodec *p;
992 p = first_avcodec;
993 while (p) {
994 if (p->decode != NULL && p->id == id)
995 return p;
996 p = p->next;
997 }
998 return NULL;
999}
1000
1001AVCodec *avcodec_find_decoder_by_name(const char *name)
1002{
1003 AVCodec *p;
1004 p = first_avcodec;
1005 while (p) {
1006 if (p->decode != NULL && strcmp(name,p->name) == 0)
1007 return p;
1008 p = p->next;
1009 }
1010 return NULL;
1011}
1012
de6d9b64
FB
1013void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
1014{
1015 const char *codec_name;
1016 AVCodec *p;
1017 char buf1[32];
623563c0 1018 char channels_str[100];
a96b68b7 1019 int bitrate;
de6d9b64
FB
1020
1021 if (encode)
1022 p = avcodec_find_encoder(enc->codec_id);
1023 else
1024 p = avcodec_find_decoder(enc->codec_id);
1025
1026 if (p) {
1027 codec_name = p->name;
98ce5991
FB
1028 if (!encode && enc->codec_id == CODEC_ID_MP3) {
1029 if (enc->sub_id == 2)
1030 codec_name = "mp2";
1031 else if (enc->sub_id == 1)
1032 codec_name = "mp1";
1033 }
985180a1
FB
1034 } else if (enc->codec_id == CODEC_ID_MPEG2TS) {
1035 /* fake mpeg2 transport stream codec (currently not
1036 registered) */
1037 codec_name = "mpeg2ts";
de6d9b64
FB
1038 } else if (enc->codec_name[0] != '\0') {
1039 codec_name = enc->codec_name;
1040 } else {
1041 /* output avi tags */
115329f1 1042 if( isprint(enc->codec_tag&0xFF) && isprint((enc->codec_tag>>8)&0xFF)
b983a5c6 1043 && isprint((enc->codec_tag>>16)&0xFF) && isprint((enc->codec_tag>>24)&0xFF)){
115329f1 1044 snprintf(buf1, sizeof(buf1), "%c%c%c%c / 0x%04X",
de6d9b64
FB
1045 enc->codec_tag & 0xff,
1046 (enc->codec_tag >> 8) & 0xff,
1047 (enc->codec_tag >> 16) & 0xff,
b983a5c6
MN
1048 (enc->codec_tag >> 24) & 0xff,
1049 enc->codec_tag);
de6d9b64
FB
1050 } else {
1051 snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag);
1052 }
1053 codec_name = buf1;
1054 }
1055
1056 switch(enc->codec_type) {
1057 case CODEC_TYPE_VIDEO:
1058 snprintf(buf, buf_size,
1059 "Video: %s%s",
7d1c3fc1 1060 codec_name, enc->mb_decision ? " (hq)" : "");
82c0c4ba 1061 if (enc->pix_fmt != PIX_FMT_NONE) {
cf087595
FB
1062 snprintf(buf + strlen(buf), buf_size - strlen(buf),
1063 ", %s",
9bbffbb1 1064 avcodec_get_pix_fmt_name(enc->pix_fmt));
cf087595 1065 }
de6d9b64
FB
1066 if (enc->width) {
1067 snprintf(buf + strlen(buf), buf_size - strlen(buf),
21189011
MN
1068 ", %dx%d",
1069 enc->width, enc->height);
1070 if(av_log_get_level() >= AV_LOG_DEBUG){
1071 int g= ff_gcd(enc->time_base.num, enc->time_base.den);
1072 snprintf(buf + strlen(buf), buf_size - strlen(buf),
1073 ", %d/%d",
1074 enc->time_base.num/g, enc->time_base.den/g);
1075 }
de6d9b64 1076 }
4bfad535
FB
1077 if (encode) {
1078 snprintf(buf + strlen(buf), buf_size - strlen(buf),
1079 ", q=%d-%d", enc->qmin, enc->qmax);
1080 }
a96b68b7 1081 bitrate = enc->bit_rate;
de6d9b64
FB
1082 break;
1083 case CODEC_TYPE_AUDIO:
1084 snprintf(buf, buf_size,
1085 "Audio: %s",
1086 codec_name);
e0d2714a
J
1087 switch (enc->channels) {
1088 case 1:
623563c0 1089 strcpy(channels_str, "mono");
e0d2714a
J
1090 break;
1091 case 2:
623563c0 1092 strcpy(channels_str, "stereo");
e0d2714a
J
1093 break;
1094 case 6:
623563c0 1095 strcpy(channels_str, "5:1");
e0d2714a
J
1096 break;
1097 default:
2fc8ea24 1098 snprintf(channels_str, sizeof(channels_str), "%d channels", enc->channels);
e0d2714a
J
1099 break;
1100 }
de6d9b64
FB
1101 if (enc->sample_rate) {
1102 snprintf(buf + strlen(buf), buf_size - strlen(buf),
1103 ", %d Hz, %s",
1104 enc->sample_rate,
e0d2714a 1105 channels_str);
de6d9b64 1106 }
115329f1 1107
a96b68b7
FB
1108 /* for PCM codecs, compute bitrate directly */
1109 switch(enc->codec_id) {
b461b3bc
RD
1110 case CODEC_ID_PCM_S32LE:
1111 case CODEC_ID_PCM_S32BE:
1112 case CODEC_ID_PCM_U32LE:
1113 case CODEC_ID_PCM_U32BE:
1114 bitrate = enc->sample_rate * enc->channels * 32;
1115 break;
1116 case CODEC_ID_PCM_S24LE:
1117 case CODEC_ID_PCM_S24BE:
1118 case CODEC_ID_PCM_U24LE:
1119 case CODEC_ID_PCM_U24BE:
1120 case CODEC_ID_PCM_S24DAUD:
1121 bitrate = enc->sample_rate * enc->channels * 24;
1122 break;
a96b68b7
FB
1123 case CODEC_ID_PCM_S16LE:
1124 case CODEC_ID_PCM_S16BE:
1125 case CODEC_ID_PCM_U16LE:
1126 case CODEC_ID_PCM_U16BE:
a190b7e9 1127 bitrate = enc->sample_rate * enc->channels * 16;
a96b68b7
FB
1128 break;
1129 case CODEC_ID_PCM_S8:
1130 case CODEC_ID_PCM_U8:
1131 case CODEC_ID_PCM_ALAW:
1132 case CODEC_ID_PCM_MULAW:
a190b7e9 1133 bitrate = enc->sample_rate * enc->channels * 8;
a96b68b7
FB
1134 break;
1135 default:
1136 bitrate = enc->bit_rate;
1137 break;
1138 }
de6d9b64 1139 break;
985180a1
FB
1140 case CODEC_TYPE_DATA:
1141 snprintf(buf, buf_size, "Data: %s", codec_name);
240c1657
FB
1142 bitrate = enc->bit_rate;
1143 break;
1144 case CODEC_TYPE_SUBTITLE:
1145 snprintf(buf, buf_size, "Subtitle: %s", codec_name);
985180a1
FB
1146 bitrate = enc->bit_rate;
1147 break;
de6d9b64 1148 default:
9fe5a7b8
MN
1149 snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type);
1150 return;
de6d9b64 1151 }
4bfad535
FB
1152 if (encode) {
1153 if (enc->flags & CODEC_FLAG_PASS1)
1154 snprintf(buf + strlen(buf), buf_size - strlen(buf),
1155 ", pass 1");
1156 if (enc->flags & CODEC_FLAG_PASS2)
1157 snprintf(buf + strlen(buf), buf_size - strlen(buf),
1158 ", pass 2");
1159 }
a96b68b7 1160 if (bitrate != 0) {
115329f1 1161 snprintf(buf + strlen(buf), buf_size - strlen(buf),
a96b68b7 1162 ", %d kb/s", bitrate / 1000);
de6d9b64
FB
1163 }
1164}
1165
156e5023
NK
1166unsigned avcodec_version( void )
1167{
1168 return LIBAVCODEC_VERSION_INT;
1169}
cf087595 1170
8bceb6af
NK
1171unsigned avcodec_build( void )
1172{
1173 return LIBAVCODEC_BUILD;
1174}
1175
43a80cce
MN
1176static void init_crcs(void){
1177 av_crc04C11DB7= av_mallocz_static(sizeof(AVCRC) * 257);
e027d0a8 1178 av_crc8005 = av_mallocz_static(sizeof(AVCRC) * 257);
b865838e 1179 av_crc07 = av_mallocz_static(sizeof(AVCRC) * 257);
43a80cce 1180 av_crc_init(av_crc04C11DB7, 0, 32, 0x04c11db7, sizeof(AVCRC)*257);
e027d0a8 1181 av_crc_init(av_crc8005 , 0, 16, 0x8005 , sizeof(AVCRC)*257);
b865838e 1182 av_crc_init(av_crc07 , 0, 8, 0x07 , sizeof(AVCRC)*257);
43a80cce
MN
1183}
1184
de6d9b64
FB
1185/* must be called before any other functions */
1186void avcodec_init(void)
1187{
0344cd0a
AB
1188 static int inited = 0;
1189
1190 if (inited != 0)
bb270c08 1191 return;
0344cd0a
AB
1192 inited = 1;
1193
59cf08ce 1194 dsputil_static_init();
43a80cce 1195 init_crcs();
de6d9b64
FB
1196}
1197
7a06ff14
MN
1198/**
1199 * Flush buffers, should be called when seeking or when swicthing to a different stream.
1200 */
1c2a8c7f
MN
1201void avcodec_flush_buffers(AVCodecContext *avctx)
1202{
7a06ff14
MN
1203 if(avctx->codec->flush)
1204 avctx->codec->flush(avctx);
1c2a8c7f
MN
1205}
1206
b100eab8 1207void avcodec_default_free_buffers(AVCodecContext *s){
d90cf87b
MN
1208 int i, j;
1209
1210 if(s->internal_buffer==NULL) return;
115329f1 1211
d90cf87b
MN
1212 for(i=0; i<INTERNAL_BUFFER_SIZE; i++){
1213 InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i];
1214 for(j=0; j<4; j++){
1215 av_freep(&buf->base[j]);
1216 buf->data[j]= NULL;
1217 }
1218 }
1219 av_freep(&s->internal_buffer);
115329f1 1220
d90cf87b
MN
1221 s->internal_buffer_count=0;
1222}
1223
d8085ea7
MN
1224char av_get_pict_type_char(int pict_type){
1225 switch(pict_type){
115329f1
DB
1226 case I_TYPE: return 'I';
1227 case P_TYPE: return 'P';
1228 case B_TYPE: return 'B';
1229 case S_TYPE: return 'S';
1230 case SI_TYPE:return 'i';
1231 case SP_TYPE:return 'p';
d8085ea7
MN
1232 default: return '?';
1233 }
1234}
1235
ac3e1834
BC
1236int av_get_bits_per_sample(enum CodecID codec_id){
1237 switch(codec_id){
5da71469 1238 case CODEC_ID_ADPCM_SBPRO_2:
f1b163e0 1239 return 2;
5da71469 1240 case CODEC_ID_ADPCM_SBPRO_3:
f1b163e0 1241 return 3;
5da71469 1242 case CODEC_ID_ADPCM_SBPRO_4:
f1b163e0
AJ
1243 case CODEC_ID_ADPCM_CT:
1244 return 4;
ac3e1834
BC
1245 case CODEC_ID_PCM_ALAW:
1246 case CODEC_ID_PCM_MULAW:
1247 case CODEC_ID_PCM_S8:
1248 case CODEC_ID_PCM_U8:
1249 return 8;
1250 case CODEC_ID_PCM_S16BE:
1251 case CODEC_ID_PCM_S16LE:
1252 case CODEC_ID_PCM_U16BE:
1253 case CODEC_ID_PCM_U16LE:
1254 return 16;
1255 case CODEC_ID_PCM_S24DAUD:
1256 case CODEC_ID_PCM_S24BE:
1257 case CODEC_ID_PCM_S24LE:
1258 case CODEC_ID_PCM_U24BE:
1259 case CODEC_ID_PCM_U24LE:
1260 return 24;
1261 case CODEC_ID_PCM_S32BE:
1262 case CODEC_ID_PCM_S32LE:
1263 case CODEC_ID_PCM_U32BE:
1264 case CODEC_ID_PCM_U32LE:
1265 return 32;
1266 default:
1267 return 0;
1268 }
1269}
1270
2450cff2 1271#if !defined(HAVE_THREADS)
ca8ad847
MN
1272int avcodec_thread_init(AVCodecContext *s, int thread_count){
1273 return -1;
1274}
1275#endif
ad2b531d
MR
1276
1277unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
1278{
1279 unsigned int n = 0;
1280
1281 while(v >= 0xff) {
1282 *s++ = 0xff;
1283 v -= 0xff;
1284 n++;
1285 }
1286 *s = v;
1287 n++;
1288 return n;
1289}
1005f542
CH
1290
1291/* Wrapper to work around the lack of mkstemp() on mingw/cygin.
1292 * Also, tries to create file in /tmp first, if possible.
1293 * *prefix can be a character constant; *filename will be allocated internally.
1294 * Returns file descriptor of opened file (or -1 on error)
1295 * and opened file name in **filename. */
1296int av_tempfile(char *prefix, char **filename) {
1297 int fd=-1;
2f30a81d 1298#ifdef __MINGW32__
1005f542
CH
1299 *filename = tempnam(".", prefix);
1300#else
1301 size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */
f2508b17 1302 *filename = av_malloc(len);
1005f542
CH
1303#endif
1304 /* -----common section-----*/
1305 if (*filename == NULL) {
1306 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n");
1307 return -1;
1308 }
2f30a81d 1309#ifdef __MINGW32__
1005f542
CH
1310 fd = open(*filename, _O_RDWR | _O_BINARY | _O_CREAT, 0444);
1311#else
1312 snprintf(*filename, len, "/tmp/%sXXXXXX", prefix);
1313 fd = mkstemp(*filename);
1314 if (fd < 0) {
1315 snprintf(*filename, len, "./%sXXXXXX", prefix);
1316 fd = mkstemp(*filename);
1317 }
1318#endif
1319 /* -----common section-----*/
1320 if (fd < 0) {
1321 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename);
1322 return -1;
1323 }
1324 return fd; /* success */
1325}