Mercurial > libavcodec.hg
annotate utils.c @ 1757:3906ddbaffec libavcodec
optimization & bugfix extracted from the 4k line diff between ffmpeg 0.4.7 and http://www.alicestreet.com/ffh263.html
the other parts of the diff where
1. spelling fixes (rejected as only a small part of it could be applied automatically)
2. cosmetics (reindention, function reordering, var renaming, ...) with bugs (rejected)
3. rtp related stuff (rejetced as it breaks several codecs)
4. some changes to the intra/inter decission & scene change detection (quality tests needed first)
| author | michael |
|---|---|
| date | Sat, 24 Jan 2004 23:47:33 +0000 |
| parents | b9309550c38f |
| children | 33f736f68b52 |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * utils for libavcodec | |
| 429 | 3 * Copyright (c) 2001 Fabrice Bellard. |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
4 * Copyright (c) 2003 Michel Bardiaux for the av_log API |
|
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1730
diff
changeset
|
5 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
| 0 | 6 * |
| 429 | 7 * This library is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | |
| 9 * License as published by the Free Software Foundation; either | |
| 10 * version 2 of the License, or (at your option) any later version. | |
| 0 | 11 * |
| 429 | 12 * This library is distributed in the hope that it will be useful, |
| 0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 * Lesser General Public License for more details. | |
| 0 | 16 * |
| 429 | 17 * You should have received a copy of the GNU Lesser General Public |
| 18 * License along with this library; if not, write to the Free Software | |
| 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 0 | 20 */ |
| 1106 | 21 |
| 22 /** | |
| 23 * @file utils.c | |
| 24 * utils. | |
| 25 */ | |
| 26 | |
| 394 | 27 #include "avcodec.h" |
| 0 | 28 #include "dsputil.h" |
| 341 | 29 #include "mpegvideo.h" |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
30 #include <stdarg.h> |
| 0 | 31 |
| 862 | 32 void *av_mallocz(unsigned int size) |
| 394 | 33 { |
| 34 void *ptr; | |
| 908 | 35 |
| 394 | 36 ptr = av_malloc(size); |
| 37 if (!ptr) | |
| 38 return NULL; | |
| 39 memset(ptr, 0, size); | |
| 40 return ptr; | |
| 41 } | |
| 42 | |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
43 char *av_strdup(const char *s) |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
44 { |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
45 char *ptr; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
46 int len; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
47 len = strlen(s) + 1; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
48 ptr = av_malloc(len); |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
49 if (!ptr) |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
50 return NULL; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
51 memcpy(ptr, s, len); |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
52 return ptr; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
53 } |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
54 |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
55 /** |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
56 * realloc which does nothing if the block is large enough |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
57 */ |
| 1057 | 58 void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size) |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
59 { |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
60 if(min_size < *size) |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
61 return ptr; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
62 |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
63 *size= min_size + 10*1024; |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
64 |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
65 return av_realloc(ptr, *size); |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
66 } |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
67 |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
68 |
|
902
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
69 /* allocation of static arrays - do not use for normal allocation */ |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
70 static unsigned int last_static = 0; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
71 static char*** array_static = NULL; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
72 static const unsigned int grow_static = 64; // ^2 |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
73 void *__av_mallocz_static(void** location, unsigned int size) |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
74 { |
| 1057 | 75 unsigned int l = (last_static + grow_static) & ~(grow_static - 1); |
|
902
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
76 void *ptr = av_mallocz(size); |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
77 if (!ptr) |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
78 return NULL; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
79 |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
80 if (location) |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
81 { |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
82 if (l > last_static) |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
83 array_static = av_realloc(array_static, l); |
|
902
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
84 array_static[last_static++] = (char**) location; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
85 *location = ptr; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
86 } |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
87 return ptr; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
88 } |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
89 /* free all static arrays and reset pointers to 0 */ |
| 1282 | 90 void av_free_static(void) |
|
902
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
91 { |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
92 if (array_static) |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
93 { |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
94 unsigned i; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
95 for (i = 0; i < last_static; i++) |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
96 { |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
97 av_free(*array_static[i]); |
|
902
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
98 *array_static[i] = NULL; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
99 } |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
100 av_free(array_static); |
|
902
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
101 array_static = 0; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
102 } |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
103 last_static = 0; |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
104 } |
|
6acc8394960d
* two functions to handle allocation of static data more simple
kabi
parents:
862
diff
changeset
|
105 |
| 400 | 106 /* cannot call it directly because of 'void **' casting is not automatic */ |
| 107 void __av_freep(void **ptr) | |
| 108 { | |
| 109 av_free(*ptr); | |
| 110 *ptr = NULL; | |
| 111 } | |
| 112 | |
| 0 | 113 /* encoder management */ |
| 114 AVCodec *first_avcodec; | |
| 115 | |
| 116 void register_avcodec(AVCodec *format) | |
| 117 { | |
| 118 AVCodec **p; | |
| 119 p = &first_avcodec; | |
| 120 while (*p != NULL) p = &(*p)->next; | |
| 121 *p = format; | |
| 122 format->next = NULL; | |
| 123 } | |
| 124 | |
| 1214 | 125 typedef struct InternalBuffer{ |
| 903 | 126 int last_pic_num; |
| 1214 | 127 uint8_t *base[4]; |
| 903 | 128 uint8_t *data[4]; |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
129 int linesize[4]; |
| 1214 | 130 }InternalBuffer; |
| 131 | |
| 132 #define INTERNAL_BUFFER_SIZE 32 | |
| 903 | 133 |
| 1538 | 134 #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) |
| 135 | |
| 136 void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ | |
| 137 int w_align= 1; | |
| 138 int h_align= 1; | |
| 139 | |
| 140 switch(s->pix_fmt){ | |
| 141 case PIX_FMT_YUV420P: | |
| 142 case PIX_FMT_YUV422: | |
| 143 case PIX_FMT_YUV422P: | |
| 144 case PIX_FMT_YUV444P: | |
| 145 case PIX_FMT_GRAY8: | |
| 146 case PIX_FMT_YUVJ420P: | |
| 147 case PIX_FMT_YUVJ422P: | |
| 148 case PIX_FMT_YUVJ444P: | |
| 149 w_align= 16; //FIXME check for non mpeg style codecs and use less alignment | |
| 150 h_align= 16; | |
| 151 break; | |
| 152 case PIX_FMT_YUV411P: | |
| 153 w_align=32; | |
| 154 h_align=8; | |
| 155 break; | |
| 156 case PIX_FMT_YUV410P: | |
| 157 if(s->codec_id == CODEC_ID_SVQ1){ | |
| 158 w_align=64; | |
| 159 h_align=64; | |
| 160 } | |
| 161 break; | |
| 162 default: | |
| 163 w_align= 1; | |
| 164 h_align= 1; | |
| 165 break; | |
| 166 } | |
| 167 | |
| 168 *width = ALIGN(*width , w_align); | |
| 169 *height= ALIGN(*height, h_align); | |
| 170 } | |
| 171 | |
| 925 | 172 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
| 903 | 173 int i; |
| 1538 | 174 int w= s->width; |
| 175 int h= s->height; | |
| 1214 | 176 InternalBuffer *buf; |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
177 int *picture_number; |
| 924 | 178 |
| 179 assert(pic->data[0]==NULL); | |
| 1214 | 180 assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count); |
| 903 | 181 |
| 1214 | 182 if(s->internal_buffer==NULL){ |
| 183 s->internal_buffer= av_mallocz(INTERNAL_BUFFER_SIZE*sizeof(InternalBuffer)); | |
| 184 } | |
| 185 #if 0 | |
| 186 s->internal_buffer= av_fast_realloc( | |
| 187 s->internal_buffer, | |
| 188 &s->internal_buffer_size, | |
| 189 sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/ | |
| 190 ); | |
| 191 #endif | |
| 192 | |
| 193 buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
194 picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE-1]).last_pic_num; //FIXME ugly hack |
|
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
195 (*picture_number)++; |
|
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
196 |
| 1214 | 197 if(buf->base[0]){ |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
198 pic->age= *picture_number - buf->last_pic_num; |
|
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
199 buf->last_pic_num= *picture_number; |
| 903 | 200 }else{ |
| 1538 | 201 int h_chroma_shift, v_chroma_shift; |
| 202 int s_align, pixel_size; | |
| 903 | 203 |
| 204 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); | |
| 1538 | 205 |
| 903 | 206 switch(s->pix_fmt){ |
| 1291 | 207 case PIX_FMT_RGB555: |
| 208 case PIX_FMT_RGB565: | |
| 903 | 209 case PIX_FMT_YUV422: |
| 210 pixel_size=2; | |
| 211 break; | |
| 212 case PIX_FMT_RGB24: | |
| 213 case PIX_FMT_BGR24: | |
| 214 pixel_size=3; | |
| 215 break; | |
| 216 case PIX_FMT_RGBA32: | |
| 217 pixel_size=4; | |
| 218 break; | |
| 219 default: | |
| 220 pixel_size=1; | |
| 221 } | |
| 1538 | 222 |
| 223 avcodec_align_dimensions(s, &w, &h); | |
| 224 #if defined(ARCH_POWERPC) || defined(HAVE_MMI) //FIXME some cleaner check | |
| 225 s_align= 16; | |
| 226 #else | |
| 227 s_align= 8; | |
| 228 #endif | |
| 229 | |
| 903 | 230 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ |
| 231 w+= EDGE_WIDTH*2; | |
| 232 h+= EDGE_WIDTH*2; | |
| 233 } | |
| 234 | |
| 1214 | 235 buf->last_pic_num= -256*256*256*64; |
| 903 | 236 |
| 237 for(i=0; i<3; i++){ | |
| 1165 | 238 const int h_shift= i==0 ? 0 : h_chroma_shift; |
| 239 const int v_shift= i==0 ? 0 : v_chroma_shift; | |
| 903 | 240 |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
241 buf->linesize[i]= ALIGN(pixel_size*w>>h_shift, s_align); |
| 903 | 242 |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
243 buf->base[i]= av_mallocz((buf->linesize[i]*h>>v_shift)+16); //FIXME 16 |
| 1214 | 244 if(buf->base[i]==NULL) return -1; |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
245 memset(buf->base[i], 128, buf->linesize[i]*h>>v_shift); |
| 903 | 246 |
| 247 if(s->flags&CODEC_FLAG_EMU_EDGE) | |
| 1214 | 248 buf->data[i] = buf->base[i]; |
| 903 | 249 else |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
250 buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), s_align); |
| 903 | 251 } |
| 252 pic->age= 256*256*256*64; | |
| 253 } | |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
254 pic->type= FF_BUFFER_TYPE_INTERNAL; |
| 903 | 255 |
| 1214 | 256 for(i=0; i<4; i++){ |
| 257 pic->base[i]= buf->base[i]; | |
| 258 pic->data[i]= buf->data[i]; | |
|
1588
de5e2acd0f80
initalize various uninitalized variables and avoid coded_picture_number as its not always correct (later should be reversed after fixing the picture_number mess)
michael
parents:
1585
diff
changeset
|
259 pic->linesize[i]= buf->linesize[i]; |
| 1214 | 260 } |
| 261 s->internal_buffer_count++; | |
| 262 | |
| 903 | 263 return 0; |
| 264 } | |
| 265 | |
| 925 | 266 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ |
| 903 | 267 int i; |
| 1214 | 268 InternalBuffer *buf, *last, temp; |
| 269 | |
| 924 | 270 assert(pic->type==FF_BUFFER_TYPE_INTERNAL); |
| 1396 | 271 assert(s->internal_buffer_count); |
| 1214 | 272 |
| 1455 | 273 buf = NULL; /* avoids warning */ |
| 1214 | 274 for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize |
| 275 buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
| 276 if(buf->data[0] == pic->data[0]) | |
| 277 break; | |
| 278 } | |
| 279 assert(i < s->internal_buffer_count); | |
| 280 s->internal_buffer_count--; | |
| 281 last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
| 282 | |
| 283 temp= *buf; | |
| 284 *buf= *last; | |
| 285 *last= temp; | |
| 286 | |
| 287 for(i=0; i<3; i++){ | |
| 903 | 288 pic->data[i]=NULL; |
| 1214 | 289 // pic->base[i]=NULL; |
| 290 } | |
| 903 | 291 //printf("R%X\n", pic->opaque); |
| 292 } | |
| 293 | |
| 1630 | 294 int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){ |
| 295 AVFrame temp_pic; | |
| 296 int i; | |
| 297 | |
| 298 /* If no picture return a new buffer */ | |
| 299 if(pic->data[0] == NULL) { | |
| 300 /* We will copy from buffer, so must be readable */ | |
| 301 pic->buffer_hints |= FF_BUFFER_HINTS_READABLE; | |
| 302 return s->get_buffer(s, pic); | |
| 303 } | |
| 304 | |
| 305 /* If internal buffer type return the same buffer */ | |
| 306 if(pic->type == FF_BUFFER_TYPE_INTERNAL) | |
| 307 return 0; | |
| 308 | |
| 309 /* | |
| 310 * Not internal type and reget_buffer not overridden, emulate cr buffer | |
| 311 */ | |
| 312 temp_pic = *pic; | |
| 313 for(i = 0; i < 4; i++) | |
| 314 pic->data[i] = pic->base[i] = NULL; | |
| 315 pic->opaque = NULL; | |
| 316 /* Allocate new frame */ | |
| 317 if (s->get_buffer(s, pic)) | |
| 318 return -1; | |
| 319 /* Copy image data from old buffer to new buffer */ | |
| 320 img_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width, | |
| 321 s->height); | |
| 322 s->release_buffer(s, &temp_pic); // Release old frame | |
| 323 return 0; | |
| 324 } | |
| 325 | |
| 998 | 326 enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, enum PixelFormat * fmt){ |
| 327 return fmt[0]; | |
| 328 } | |
| 329 | |
| 681 | 330 void avcodec_get_context_defaults(AVCodecContext *s){ |
| 685 | 331 s->bit_rate= 800*1000; |
| 332 s->bit_rate_tolerance= s->bit_rate*10; | |
| 681 | 333 s->qmin= 2; |
| 334 s->qmax= 31; | |
| 932 | 335 s->mb_qmin= 2; |
| 336 s->mb_qmax= 31; | |
| 681 | 337 s->rc_eq= "tex^qComp"; |
| 338 s->qcompress= 0.5; | |
| 685 | 339 s->max_qdiff= 3; |
| 340 s->b_quant_factor=1.25; | |
| 341 s->b_quant_offset=1.25; | |
|
686
83d2c9d50d7d
fixing i_quant_factor, this should finally fix the bitrate bug with ffserver hopefully
michaelni
parents:
685
diff
changeset
|
342 s->i_quant_factor=-0.8; |
| 685 | 343 s->i_quant_offset=0.0; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
742
diff
changeset
|
344 s->error_concealment= 3; |
| 762 | 345 s->error_resilience= 1; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
742
diff
changeset
|
346 s->workaround_bugs= FF_BUG_AUTODETECT; |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
347 s->frame_rate_base= 1; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
348 s->frame_rate = 25; |
| 762 | 349 s->gop_size= 50; |
| 350 s->me_method= ME_EPZS; | |
| 903 | 351 s->get_buffer= avcodec_default_get_buffer; |
| 352 s->release_buffer= avcodec_default_release_buffer; | |
| 998 | 353 s->get_format= avcodec_default_get_format; |
| 954 | 354 s->me_subpel_quality=8; |
|
1505
010f76d07a27
use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken
michaelni
parents:
1456
diff
changeset
|
355 s->lmin= FF_QP2LAMBDA * s->qmin; |
|
010f76d07a27
use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken
michaelni
parents:
1456
diff
changeset
|
356 s->lmax= FF_QP2LAMBDA * s->qmax; |
| 1548 | 357 s->sample_aspect_ratio= (AVRational){0,1}; |
| 1730 | 358 s->ildct_cmp= FF_CMP_VSAD; |
| 1150 | 359 |
| 360 s->intra_quant_bias= FF_DEFAULT_QUANT_BIAS; | |
| 361 s->inter_quant_bias= FF_DEFAULT_QUANT_BIAS; | |
|
1585
6b224ca24033
revised palette API, courtesy of Roberto Togni (rtogni at freemail.it)
melanson
parents:
1582
diff
changeset
|
362 s->palctrl = NULL; |
| 1630 | 363 s->reget_buffer= avcodec_default_reget_buffer; |
| 681 | 364 } |
| 365 | |
| 366 /** | |
| 367 * allocates a AVCodecContext and set it to defaults. | |
| 368 * this can be deallocated by simply calling free() | |
| 369 */ | |
| 703 | 370 AVCodecContext *avcodec_alloc_context(void){ |
| 681 | 371 AVCodecContext *avctx= av_mallocz(sizeof(AVCodecContext)); |
| 372 | |
| 373 if(avctx==NULL) return NULL; | |
| 374 | |
| 375 avcodec_get_context_defaults(avctx); | |
| 376 | |
| 377 return avctx; | |
| 378 } | |
| 379 | |
| 903 | 380 /** |
| 925 | 381 * allocates a AVPFrame and set it to defaults. |
| 903 | 382 * this can be deallocated by simply calling free() |
| 383 */ | |
| 925 | 384 AVFrame *avcodec_alloc_frame(void){ |
| 385 AVFrame *pic= av_mallocz(sizeof(AVFrame)); | |
| 903 | 386 |
| 387 return pic; | |
| 388 } | |
| 389 | |
| 0 | 390 int avcodec_open(AVCodecContext *avctx, AVCodec *codec) |
| 391 { | |
| 392 int ret; | |
| 393 | |
|
1456
670fca257a69
detect avcodec_open() on an already opened AVCodecContext
michaelni
parents:
1455
diff
changeset
|
394 if(avctx->codec) |
|
670fca257a69
detect avcodec_open() on an already opened AVCodecContext
michaelni
parents:
1455
diff
changeset
|
395 return -1; |
|
670fca257a69
detect avcodec_open() on an already opened AVCodecContext
michaelni
parents:
1455
diff
changeset
|
396 |
| 0 | 397 avctx->codec = codec; |
| 927 | 398 avctx->codec_id = codec->id; |
| 0 | 399 avctx->frame_number = 0; |
|
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
400 if (codec->priv_data_size > 0) { |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
401 avctx->priv_data = av_mallocz(codec->priv_data_size); |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
402 if (!avctx->priv_data) |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
403 return -ENOMEM; |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
404 } else { |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
405 avctx->priv_data = NULL; |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
406 } |
| 0 | 407 ret = avctx->codec->init(avctx); |
| 408 if (ret < 0) { | |
| 394 | 409 av_freep(&avctx->priv_data); |
| 0 | 410 return ret; |
| 411 } | |
| 412 return 0; | |
| 413 } | |
| 414 | |
| 1064 | 415 int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
| 0 | 416 const short *samples) |
| 417 { | |
| 418 int ret; | |
| 419 | |
| 420 ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples); | |
| 421 avctx->frame_number++; | |
| 422 return ret; | |
| 423 } | |
| 424 | |
| 1064 | 425 int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
| 925 | 426 const AVFrame *pict) |
| 0 | 427 { |
| 428 int ret; | |
| 429 | |
| 430 ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict); | |
| 814 | 431 |
| 432 emms_c(); //needed to avoid a emms_c() call before every return; | |
| 433 | |
| 0 | 434 avctx->frame_number++; |
| 435 return ret; | |
| 436 } | |
| 437 | |
| 1249 | 438 /** |
| 439 * decode a frame. | |
| 440 * @param buf bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE larger then the actual read bytes | |
| 441 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | |
| 442 * @param buf_size the size of the buffer in bytes | |
| 443 * @param got_picture_ptr zero if no frame could be decompressed, Otherwise, it is non zero | |
| 444 * @return -1 if error, otherwise return the number of | |
| 445 * bytes used. | |
| 446 */ | |
| 925 | 447 int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, |
| 0 | 448 int *got_picture_ptr, |
| 1064 | 449 uint8_t *buf, int buf_size) |
| 0 | 450 { |
| 451 int ret; | |
| 903 | 452 |
| 0 | 453 ret = avctx->codec->decode(avctx, picture, got_picture_ptr, |
| 454 buf, buf_size); | |
| 814 | 455 |
| 456 emms_c(); //needed to avoid a emms_c() call before every return; | |
| 903 | 457 |
|
267
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
260
diff
changeset
|
458 if (*got_picture_ptr) |
|
e10840e4f773
- Bug fix MPEG-2 decoder to handle "repeat_first_field" (Telecine)
pulento
parents:
260
diff
changeset
|
459 avctx->frame_number++; |
| 0 | 460 return ret; |
| 461 } | |
| 462 | |
| 463 /* decode an audio frame. return -1 if error, otherwise return the | |
| 464 *number of bytes used. If no frame could be decompressed, | |
| 465 *frame_size_ptr is zero. Otherwise, it is the decompressed frame | |
| 466 *size in BYTES. */ | |
| 1064 | 467 int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, |
| 0 | 468 int *frame_size_ptr, |
| 1064 | 469 uint8_t *buf, int buf_size) |
| 0 | 470 { |
| 471 int ret; | |
| 472 | |
| 473 ret = avctx->codec->decode(avctx, samples, frame_size_ptr, | |
| 474 buf, buf_size); | |
| 475 avctx->frame_number++; | |
| 476 return ret; | |
| 477 } | |
| 478 | |
| 479 int avcodec_close(AVCodecContext *avctx) | |
| 480 { | |
| 481 if (avctx->codec->close) | |
| 482 avctx->codec->close(avctx); | |
| 394 | 483 av_freep(&avctx->priv_data); |
| 0 | 484 avctx->codec = NULL; |
| 485 return 0; | |
| 486 } | |
| 487 | |
| 488 AVCodec *avcodec_find_encoder(enum CodecID id) | |
| 489 { | |
| 490 AVCodec *p; | |
| 491 p = first_avcodec; | |
| 492 while (p) { | |
| 493 if (p->encode != NULL && p->id == id) | |
| 494 return p; | |
| 495 p = p->next; | |
| 496 } | |
| 497 return NULL; | |
| 498 } | |
| 499 | |
| 177 | 500 AVCodec *avcodec_find_encoder_by_name(const char *name) |
| 501 { | |
| 502 AVCodec *p; | |
| 503 p = first_avcodec; | |
| 504 while (p) { | |
| 505 if (p->encode != NULL && strcmp(name,p->name) == 0) | |
| 506 return p; | |
| 507 p = p->next; | |
| 508 } | |
| 509 return NULL; | |
| 510 } | |
| 511 | |
| 0 | 512 AVCodec *avcodec_find_decoder(enum CodecID id) |
| 513 { | |
| 514 AVCodec *p; | |
| 515 p = first_avcodec; | |
| 516 while (p) { | |
| 517 if (p->decode != NULL && p->id == id) | |
| 518 return p; | |
| 519 p = p->next; | |
| 520 } | |
| 521 return NULL; | |
| 522 } | |
| 523 | |
| 524 AVCodec *avcodec_find_decoder_by_name(const char *name) | |
| 525 { | |
| 526 AVCodec *p; | |
| 527 p = first_avcodec; | |
| 528 while (p) { | |
| 529 if (p->decode != NULL && strcmp(name,p->name) == 0) | |
| 530 return p; | |
| 531 p = p->next; | |
| 532 } | |
| 533 return NULL; | |
| 534 } | |
| 535 | |
| 536 AVCodec *avcodec_find(enum CodecID id) | |
| 537 { | |
| 538 AVCodec *p; | |
| 539 p = first_avcodec; | |
| 540 while (p) { | |
| 541 if (p->id == id) | |
| 542 return p; | |
| 543 p = p->next; | |
| 544 } | |
| 545 return NULL; | |
| 546 } | |
| 547 | |
| 548 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) | |
| 549 { | |
| 550 const char *codec_name; | |
| 551 AVCodec *p; | |
| 552 char buf1[32]; | |
| 337 | 553 char channels_str[100]; |
| 92 | 554 int bitrate; |
| 0 | 555 |
| 556 if (encode) | |
| 557 p = avcodec_find_encoder(enc->codec_id); | |
| 558 else | |
| 559 p = avcodec_find_decoder(enc->codec_id); | |
| 560 | |
| 561 if (p) { | |
| 562 codec_name = p->name; | |
|
1449
7fbe89a76b73
update sub_id in mpegaudio decoding (might need same method as MPEG2VIDEO too ?)
bellard
parents:
1396
diff
changeset
|
563 if (!encode && enc->codec_id == CODEC_ID_MP3) { |
|
7fbe89a76b73
update sub_id in mpegaudio decoding (might need same method as MPEG2VIDEO too ?)
bellard
parents:
1396
diff
changeset
|
564 if (enc->sub_id == 2) |
|
7fbe89a76b73
update sub_id in mpegaudio decoding (might need same method as MPEG2VIDEO too ?)
bellard
parents:
1396
diff
changeset
|
565 codec_name = "mp2"; |
|
7fbe89a76b73
update sub_id in mpegaudio decoding (might need same method as MPEG2VIDEO too ?)
bellard
parents:
1396
diff
changeset
|
566 else if (enc->sub_id == 1) |
|
7fbe89a76b73
update sub_id in mpegaudio decoding (might need same method as MPEG2VIDEO too ?)
bellard
parents:
1396
diff
changeset
|
567 codec_name = "mp1"; |
|
7fbe89a76b73
update sub_id in mpegaudio decoding (might need same method as MPEG2VIDEO too ?)
bellard
parents:
1396
diff
changeset
|
568 } |
|
1582
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
569 } else if (enc->codec_id == CODEC_ID_MPEG2TS) { |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
570 /* fake mpeg2 transport stream codec (currently not |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
571 registered) */ |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
572 codec_name = "mpeg2ts"; |
| 0 | 573 } else if (enc->codec_name[0] != '\0') { |
| 574 codec_name = enc->codec_name; | |
| 575 } else { | |
| 576 /* output avi tags */ | |
| 577 if (enc->codec_type == CODEC_TYPE_VIDEO) { | |
| 578 snprintf(buf1, sizeof(buf1), "%c%c%c%c", | |
| 579 enc->codec_tag & 0xff, | |
| 580 (enc->codec_tag >> 8) & 0xff, | |
| 581 (enc->codec_tag >> 16) & 0xff, | |
| 582 (enc->codec_tag >> 24) & 0xff); | |
| 583 } else { | |
| 584 snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag); | |
| 585 } | |
| 586 codec_name = buf1; | |
| 587 } | |
| 588 | |
| 589 switch(enc->codec_type) { | |
| 590 case CODEC_TYPE_VIDEO: | |
| 591 snprintf(buf, buf_size, | |
| 592 "Video: %s%s", | |
| 1389 | 593 codec_name, enc->mb_decision ? " (hq)" : ""); |
| 55 | 594 if (enc->codec_id == CODEC_ID_RAWVIDEO) { |
| 595 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 596 ", %s", | |
|
988
001b7d3045e5
moved avcodec_get_chroma_sub_sample() to imgconvert.c
bellard
parents:
963
diff
changeset
|
597 avcodec_get_pix_fmt_name(enc->pix_fmt)); |
| 55 | 598 } |
| 0 | 599 if (enc->width) { |
| 600 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 601 ", %dx%d, %0.2f fps", | |
| 602 enc->width, enc->height, | |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
603 (float)enc->frame_rate / enc->frame_rate_base); |
| 0 | 604 } |
| 741 | 605 if (encode) { |
| 606 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 607 ", q=%d-%d", enc->qmin, enc->qmax); | |
| 608 } | |
| 92 | 609 bitrate = enc->bit_rate; |
| 0 | 610 break; |
| 611 case CODEC_TYPE_AUDIO: | |
| 612 snprintf(buf, buf_size, | |
| 613 "Audio: %s", | |
| 614 codec_name); | |
|
318
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
615 switch (enc->channels) { |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
616 case 1: |
| 337 | 617 strcpy(channels_str, "mono"); |
|
318
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
618 break; |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
619 case 2: |
| 337 | 620 strcpy(channels_str, "stereo"); |
|
318
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
621 break; |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
622 case 6: |
| 337 | 623 strcpy(channels_str, "5:1"); |
|
318
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
624 break; |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
625 default: |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
626 sprintf(channels_str, "%d channels", enc->channels); |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
627 break; |
|
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
628 } |
| 0 | 629 if (enc->sample_rate) { |
| 630 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 631 ", %d Hz, %s", | |
| 632 enc->sample_rate, | |
|
318
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
633 channels_str); |
| 0 | 634 } |
|
318
21697f35a9ca
- Fixed AC3 decoding for 5:1 AC3 streams. Now when calling av_audio_decode for
pulento
parents:
315
diff
changeset
|
635 |
| 92 | 636 /* for PCM codecs, compute bitrate directly */ |
| 637 switch(enc->codec_id) { | |
| 638 case CODEC_ID_PCM_S16LE: | |
| 639 case CODEC_ID_PCM_S16BE: | |
| 640 case CODEC_ID_PCM_U16LE: | |
| 641 case CODEC_ID_PCM_U16BE: | |
| 94 | 642 bitrate = enc->sample_rate * enc->channels * 16; |
| 92 | 643 break; |
| 644 case CODEC_ID_PCM_S8: | |
| 645 case CODEC_ID_PCM_U8: | |
| 646 case CODEC_ID_PCM_ALAW: | |
| 647 case CODEC_ID_PCM_MULAW: | |
| 94 | 648 bitrate = enc->sample_rate * enc->channels * 8; |
| 92 | 649 break; |
| 650 default: | |
| 651 bitrate = enc->bit_rate; | |
| 652 break; | |
| 653 } | |
| 0 | 654 break; |
|
1582
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
655 case CODEC_TYPE_DATA: |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
656 snprintf(buf, buf_size, "Data: %s", codec_name); |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
657 bitrate = enc->bit_rate; |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
658 break; |
| 0 | 659 default: |
| 583 | 660 av_abort(); |
| 0 | 661 } |
| 741 | 662 if (encode) { |
| 663 if (enc->flags & CODEC_FLAG_PASS1) | |
| 664 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 665 ", pass 1"); | |
| 666 if (enc->flags & CODEC_FLAG_PASS2) | |
| 667 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 668 ", pass 2"); | |
| 669 } | |
| 92 | 670 if (bitrate != 0) { |
| 0 | 671 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
| 92 | 672 ", %d kb/s", bitrate / 1000); |
| 0 | 673 } |
| 674 } | |
| 675 | |
| 362 | 676 unsigned avcodec_version( void ) |
| 677 { | |
| 678 return LIBAVCODEC_VERSION_INT; | |
| 679 } | |
| 55 | 680 |
| 379 | 681 unsigned avcodec_build( void ) |
| 682 { | |
| 683 return LIBAVCODEC_BUILD; | |
| 684 } | |
| 685 | |
| 0 | 686 /* must be called before any other functions */ |
| 687 void avcodec_init(void) | |
| 688 { | |
|
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
689 static int inited = 0; |
|
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
690 |
|
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
691 if (inited != 0) |
|
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
692 return; |
|
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
693 inited = 1; |
|
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
694 |
| 1201 | 695 dsputil_static_init(); |
| 0 | 696 } |
| 697 | |
| 1368 | 698 /** |
| 699 * Flush buffers, should be called when seeking or when swicthing to a different stream. | |
| 700 */ | |
| 341 | 701 void avcodec_flush_buffers(AVCodecContext *avctx) |
| 702 { | |
| 1368 | 703 if(avctx->codec->flush) |
| 704 avctx->codec->flush(avctx); | |
| 341 | 705 } |
| 706 | |
| 1214 | 707 void avcodec_default_free_buffers(AVCodecContext *s){ |
| 708 int i, j; | |
| 709 | |
| 710 if(s->internal_buffer==NULL) return; | |
| 711 | |
| 712 for(i=0; i<INTERNAL_BUFFER_SIZE; i++){ | |
| 713 InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
| 714 for(j=0; j<4; j++){ | |
| 715 av_freep(&buf->base[j]); | |
| 716 buf->data[j]= NULL; | |
| 717 } | |
| 718 } | |
| 719 av_freep(&s->internal_buffer); | |
| 720 | |
| 721 s->internal_buffer_count=0; | |
| 722 } | |
| 723 | |
| 1264 | 724 char av_get_pict_type_char(int pict_type){ |
| 725 switch(pict_type){ | |
| 726 case I_TYPE: return 'I'; | |
| 727 case P_TYPE: return 'P'; | |
| 728 case B_TYPE: return 'B'; | |
| 729 case S_TYPE: return 'S'; | |
| 730 case SI_TYPE:return 'i'; | |
| 731 case SP_TYPE:return 'p'; | |
| 732 default: return '?'; | |
| 733 } | |
| 734 } | |
| 735 | |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
736 int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
737 int exact=1, sign=0; |
|
1549
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
738 int64_t gcd; |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
739 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
740 assert(den != 0); |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
741 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
742 if(den < 0){ |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
743 den= -den; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
744 nom= -nom; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
745 } |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
746 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
747 if(nom < 0){ |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
748 nom= -nom; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
749 sign= 1; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
750 } |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
751 |
|
1549
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
752 gcd = ff_gcd(nom, den); |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
753 nom /= gcd; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
754 den /= gcd; |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
755 |
|
1549
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
756 if(nom > max || den > max){ |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
757 AVRational a0={0,1}, a1={1,0}; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
758 exact=0; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
759 |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
760 for(;;){ |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
761 int64_t x= nom / den; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
762 int64_t a2n= x*a1.num + a0.num; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
763 int64_t a2d= x*a1.den + a0.den; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
764 |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
765 if(a2n > max || a2d > max) break; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
766 |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
767 nom %= den; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
768 |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
769 a0= a1; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
770 a1= (AVRational){a2n, a2d}; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
771 if(nom==0) break; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
772 x= nom; nom=den; den=x; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
773 } |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
774 nom= a1.num; |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
775 den= a1.den; |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
776 } |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
777 |
|
1549
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
778 assert(ff_gcd(nom, den) == 1); |
|
5e643dd7e889
use continued fractions to approximate a fraction if its numerator or denominator is too large
michael
parents:
1548
diff
changeset
|
779 |
|
1126
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
780 if(sign) nom= -nom; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
781 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
782 *dst_nom = nom; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
783 *dst_den = den; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
784 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
785 return exact; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
786 } |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
787 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
788 int64_t av_rescale(int64_t a, int b, int c){ |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
789 uint64_t h, l; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
790 assert(c > 0); |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
791 assert(b >=0); |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
792 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
793 if(a<0) return -av_rescale(-a, b, c); |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
794 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
795 h= a>>32; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
796 if(h==0) return a*b/c; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
797 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
798 l= a&0xFFFFFFFF; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
799 l *= b; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
800 h *= b; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
801 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
802 l += (h%c)<<32; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
803 |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
804 return ((h/c)<<32) + l/c; |
|
77ccf7fe3bd0
per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents:
1106
diff
changeset
|
805 } |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
806 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
807 /* av_log API */ |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
808 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
809 #ifdef AV_LOG_TRAP_PRINTF |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
810 #undef stderr |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
811 #undef fprintf |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
812 #endif |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
813 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
814 static int av_log_level = AV_LOG_DEBUG; |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
815 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
816 static void av_log_default_callback(AVCodecContext* avctx, int level, const char* fmt, va_list vl) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
817 { |
| 1600 | 818 static int print_prefix=1; |
| 819 | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
820 if(level>av_log_level) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
821 return; |
| 1600 | 822 if(avctx && print_prefix) |
| 1755 | 823 fprintf(stderr, "[%s @ %p]", avctx->codec ? avctx->codec->name : "?", avctx); |
| 1600 | 824 |
| 825 print_prefix= (int)strstr(fmt, "\n"); | |
| 826 | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
827 vfprintf(stderr, fmt, vl); |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
828 } |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
829 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
830 static void (*av_log_callback)(AVCodecContext*, int, const char*, va_list) = av_log_default_callback; |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
831 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
832 void av_log(AVCodecContext* avctx, int level, const char *fmt, ...) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
833 { |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
834 va_list vl; |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
835 va_start(vl, fmt); |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
836 av_vlog(avctx, level, fmt, vl); |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
837 va_end(vl); |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
838 } |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
839 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
840 void av_vlog(AVCodecContext* avctx, int level, const char *fmt, va_list vl) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
841 { |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
842 av_log_callback(avctx, level, fmt, vl); |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
843 } |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
844 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
845 int av_log_get_level(void) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
846 { |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
847 return av_log_level; |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
848 } |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
849 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
850 void av_log_set_level(int level) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
851 { |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
852 av_log_level = level; |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
853 } |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
854 |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
855 void av_log_set_callback(void (*callback)(AVCodecContext*, int, const char*, va_list)) |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
856 { |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
857 av_log_callback = callback; |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
858 } |
|
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
859 |
