Mercurial > libavcodec.hg
annotate utils.c @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
author | cehoyos |
---|---|
date | Fri, 20 Feb 2009 16:20:01 +0000 |
parents | 5a9485bd4421 |
children | 90c99bda19f5 |
rev | line source |
---|---|
0 | 1 /* |
2 * utils for libavcodec | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8611
diff
changeset
|
3 * Copyright (c) 2001 Fabrice Bellard |
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1730
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
0 | 5 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
429 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
0 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
0 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 * Lesser General Public License for more details. | |
0 | 17 * |
429 | 18 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3031
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 21 */ |
2967 | 22 |
1106 | 23 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8629
diff
changeset
|
24 * @file libavcodec/utils.c |
1106 | 25 * utils. |
26 */ | |
2967 | 27 |
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
28 /* needed for mkstemp() */ |
7936 | 29 #define _XOPEN_SOURCE 600 |
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
30 |
8110 | 31 #include "libavutil/avstring.h" |
6763 | 32 #include "libavutil/integer.h" |
33 #include "libavutil/crc.h" | |
394 | 34 #include "avcodec.h" |
0 | 35 #include "dsputil.h" |
2880 | 36 #include "opt.h" |
6360 | 37 #include "imgconvert.h" |
7454
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
38 #include "audioconvert.h" |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
39 #include "internal.h" |
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
40 #include <stdlib.h> |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
41 #include <stdarg.h> |
2002
b737b5e96ee0
use AVInteger in av_rescale() so it can finally do 64*64/64 instead of just 64*32/32
michael
parents:
1996
diff
changeset
|
42 #include <limits.h> |
2862 | 43 #include <float.h> |
8590 | 44 #if !HAVE_MKSTEMP |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
45 #include <fcntl.h> |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
46 #endif |
0 | 47 |
2652
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
48 const uint8_t ff_reverse[256]={ |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
49 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
50 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
51 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
52 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
53 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
54 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
55 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
56 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
57 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
58 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
59 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
60 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
61 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
62 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
63 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
64 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF, |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
65 }; |
659b92488061
ff_reverse to utils.c patch by (Roine Gustafsson )roine users.sourceforge net)
michael
parents:
2637
diff
changeset
|
66 |
2806 | 67 static int volatile entangled_thread_counter=0; |
68 | |
1057 | 69 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
|
70 { |
2967 | 71 if(min_size < *size) |
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
72 return ptr; |
2967 | 73 |
2422 | 74 *size= FFMAX(17*min_size/16 + 32, min_size); |
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
75 |
6532
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
76 ptr= av_realloc(ptr, *size); |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
77 if(!ptr) //we could set this to the unmodified min_size but this is safer if the user lost the ptr and uses NULL now |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
78 *size= 0; |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
79 |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
80 return ptr; |
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
81 } |
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
82 |
0 | 83 /* encoder management */ |
7992 | 84 static AVCodec *first_avcodec = NULL; |
0 | 85 |
6011 | 86 AVCodec *av_codec_next(AVCodec *c){ |
87 if(c) return c->next; | |
88 else return first_avcodec; | |
89 } | |
90 | |
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
91 void avcodec_register(AVCodec *codec) |
0 | 92 { |
93 AVCodec **p; | |
8325 | 94 avcodec_init(); |
0 | 95 p = &first_avcodec; |
96 while (*p != NULL) p = &(*p)->next; | |
8324
343f0476fd1d
Use a more explicit "codec" rather than "format" as the parameter of
stefano
parents:
8281
diff
changeset
|
97 *p = codec; |
343f0476fd1d
Use a more explicit "codec" rather than "format" as the parameter of
stefano
parents:
8281
diff
changeset
|
98 codec->next = NULL; |
0 | 99 } |
100 | |
8752
7fd1422a8703
Drop the deprecated function register_avcodec() at the next major
stefano
parents:
8750
diff
changeset
|
101 #if LIBAVCODEC_VERSION_MAJOR < 53 |
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
102 void register_avcodec(AVCodec *codec) |
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
103 { |
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
104 avcodec_register(codec); |
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
105 } |
8752
7fd1422a8703
Drop the deprecated function register_avcodec() at the next major
stefano
parents:
8750
diff
changeset
|
106 #endif |
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
107 |
2270 | 108 void avcodec_set_dimensions(AVCodecContext *s, int width, int height){ |
109 s->coded_width = width; | |
110 s->coded_height= height; | |
111 s->width = -((-width )>>s->lowres); | |
112 s->height= -((-height)>>s->lowres); | |
113 } | |
114 | |
1214 | 115 typedef struct InternalBuffer{ |
903 | 116 int last_pic_num; |
1214 | 117 uint8_t *base[4]; |
903 | 118 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
|
119 int linesize[4]; |
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
120 int width, height; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
121 enum PixelFormat pix_fmt; |
1214 | 122 }InternalBuffer; |
123 | |
124 #define INTERNAL_BUFFER_SIZE 32 | |
903 | 125 |
1538 | 126 #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) |
127 | |
128 void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ | |
2967 | 129 int w_align= 1; |
130 int h_align= 1; | |
131 | |
1538 | 132 switch(s->pix_fmt){ |
133 case PIX_FMT_YUV420P: | |
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4453
diff
changeset
|
134 case PIX_FMT_YUYV422: |
2137
ef47c0b1ff28
UYVY support patch by ("Todd.Kirby" <doubleshot at pacbell dot net>)
michael
parents:
2125
diff
changeset
|
135 case PIX_FMT_UYVY422: |
1538 | 136 case PIX_FMT_YUV422P: |
137 case PIX_FMT_YUV444P: | |
138 case PIX_FMT_GRAY8: | |
4066 | 139 case PIX_FMT_GRAY16BE: |
140 case PIX_FMT_GRAY16LE: | |
1538 | 141 case PIX_FMT_YUVJ420P: |
142 case PIX_FMT_YUVJ422P: | |
143 case PIX_FMT_YUVJ444P: | |
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
144 case PIX_FMT_YUVA420P: |
1538 | 145 w_align= 16; //FIXME check for non mpeg style codecs and use less alignment |
146 h_align= 16; | |
147 break; | |
148 case PIX_FMT_YUV411P: | |
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4453
diff
changeset
|
149 case PIX_FMT_UYYVYY411: |
1538 | 150 w_align=32; |
151 h_align=8; | |
152 break; | |
153 case PIX_FMT_YUV410P: | |
154 if(s->codec_id == CODEC_ID_SVQ1){ | |
155 w_align=64; | |
156 h_align=64; | |
157 } | |
2104 | 158 case PIX_FMT_RGB555: |
159 if(s->codec_id == CODEC_ID_RPZA){ | |
160 w_align=4; | |
161 h_align=4; | |
162 } | |
163 case PIX_FMT_PAL8: | |
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
164 case PIX_FMT_BGR8: |
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
165 case PIX_FMT_RGB8: |
2104 | 166 if(s->codec_id == CODEC_ID_SMC){ |
167 w_align=4; | |
168 h_align=4; | |
169 } | |
1538 | 170 break; |
2418
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
171 case PIX_FMT_BGR24: |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
172 if((s->codec_id == CODEC_ID_MSZH) || (s->codec_id == CODEC_ID_ZLIB)){ |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
173 w_align=4; |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
174 h_align=4; |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
175 } |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
176 break; |
1538 | 177 default: |
178 w_align= 1; | |
179 h_align= 1; | |
180 break; | |
181 } | |
182 | |
183 *width = ALIGN(*width , w_align); | |
184 *height= ALIGN(*height, h_align); | |
7942
64f35acc2407
Allocate 1 line more in the chroma plane for H.264, this avoids some
michael
parents:
7941
diff
changeset
|
185 if(s->codec_id == CODEC_ID_H264) |
64f35acc2407
Allocate 1 line more in the chroma plane for H.264, this avoids some
michael
parents:
7941
diff
changeset
|
186 *height+=2; // some of the optimized chroma MC reads one line too much |
1538 | 187 } |
188 | |
2422 | 189 int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h){ |
190 if((int)w>0 && (int)h>0 && (w+128)*(uint64_t)(h+128) < INT_MAX/4) | |
191 return 0; | |
2967 | 192 |
2422 | 193 av_log(av_log_ctx, AV_LOG_ERROR, "picture size invalid (%ux%u)\n", w, h); |
194 return -1; | |
195 } | |
196 | |
925 | 197 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
903 | 198 int i; |
1538 | 199 int w= s->width; |
200 int h= s->height; | |
1214 | 201 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
|
202 int *picture_number; |
2422 | 203 |
4453
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
204 if(pic->data[0]!=NULL) { |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
205 av_log(s, AV_LOG_ERROR, "pic->data[0]!=NULL in avcodec_default_get_buffer\n"); |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
206 return -1; |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
207 } |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
208 if(s->internal_buffer_count >= INTERNAL_BUFFER_SIZE) { |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
209 av_log(s, AV_LOG_ERROR, "internal_buffer_count overflow (missing release_buffer?)\n"); |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
210 return -1; |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
211 } |
903 | 212 |
2422 | 213 if(avcodec_check_dimensions(s,w,h)) |
214 return -1; | |
215 | |
1214 | 216 if(s->internal_buffer==NULL){ |
7307
52764a3665d8
Make the ugly hack which uses an unused entry in the internal buffer
michael
parents:
7293
diff
changeset
|
217 s->internal_buffer= av_mallocz((INTERNAL_BUFFER_SIZE+1)*sizeof(InternalBuffer)); |
1214 | 218 } |
219 #if 0 | |
220 s->internal_buffer= av_fast_realloc( | |
2967 | 221 s->internal_buffer, |
222 &s->internal_buffer_size, | |
1214 | 223 sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/ |
224 ); | |
225 #endif | |
2967 | 226 |
1214 | 227 buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; |
7307
52764a3665d8
Make the ugly hack which uses an unused entry in the internal buffer
michael
parents:
7293
diff
changeset
|
228 picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE]).last_pic_num; //FIXME ugly hack |
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
|
229 (*picture_number)++; |
2967 | 230 |
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
231 if(buf->base[0] && (buf->width != w || buf->height != h || buf->pix_fmt != s->pix_fmt)){ |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
232 for(i=0; i<4; i++){ |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
233 av_freep(&buf->base[i]); |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
234 buf->data[i]= NULL; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
235 } |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
236 } |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
237 |
1214 | 238 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
|
239 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
|
240 buf->last_pic_num= *picture_number; |
903 | 241 }else{ |
1538 | 242 int h_chroma_shift, v_chroma_shift; |
6360 | 243 int size[4] = {0}; |
244 int tmpsize; | |
2950 | 245 AVPicture picture; |
7941
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
246 int stride_align[4]; |
2950 | 247 |
903 | 248 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); |
1538 | 249 |
250 avcodec_align_dimensions(s, &w, &h); | |
2967 | 251 |
903 | 252 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ |
253 w+= EDGE_WIDTH*2; | |
254 h+= EDGE_WIDTH*2; | |
255 } | |
4986 | 256 |
6360 | 257 ff_fill_linesize(&picture, s->pix_fmt, w); |
258 | |
7941
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
259 for (i=0; i<4; i++){ |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
260 //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
261 //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
262 //picture size unneccessarily in some cases. The solution here is not |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
263 //pretty and better ideas are welcome! |
8590 | 264 #if HAVE_MMX |
7941
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
265 if(s->codec_id == CODEC_ID_SVQ1) |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
266 stride_align[i]= 16; |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
267 else |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
268 #endif |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
269 stride_align[i] = STRIDE_ALIGN; |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
270 picture.linesize[i] = ALIGN(picture.linesize[i], stride_align[i]); |
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
271 } |
6360 | 272 |
273 tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h); | |
274 | |
275 for (i=0; i<3 && picture.data[i+1]; i++) | |
276 size[i] = picture.data[i+1] - picture.data[i]; | |
6390 | 277 size[i] = tmpsize - (picture.data[i] - picture.data[0]); |
2950 | 278 |
1214 | 279 buf->last_pic_num= -256*256*256*64; |
2950 | 280 memset(buf->base, 0, sizeof(buf->base)); |
281 memset(buf->data, 0, sizeof(buf->data)); | |
903 | 282 |
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
283 for(i=0; i<4 && size[i]; i++){ |
1165 | 284 const int h_shift= i==0 ? 0 : h_chroma_shift; |
285 const int v_shift= i==0 ? 0 : v_chroma_shift; | |
903 | 286 |
2950 | 287 buf->linesize[i]= picture.linesize[i]; |
903 | 288 |
2950 | 289 buf->base[i]= av_malloc(size[i]+16); //FIXME 16 |
1214 | 290 if(buf->base[i]==NULL) return -1; |
2950 | 291 memset(buf->base[i], 128, size[i]); |
292 | |
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
293 // no edge if EDEG EMU or not planar YUV |
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
294 if((s->flags&CODEC_FLAG_EMU_EDGE) || !size[2]) |
1214 | 295 buf->data[i] = buf->base[i]; |
903 | 296 else |
7941
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
297 buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), stride_align[i]); |
903 | 298 } |
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
299 if(size[1] && !size[2]) |
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
300 ff_set_systematic_pal((uint32_t*)buf->data[1], s->pix_fmt); |
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
301 buf->width = s->width; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
302 buf->height = s->height; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
303 buf->pix_fmt= s->pix_fmt; |
903 | 304 pic->age= 256*256*256*64; |
305 } | |
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
|
306 pic->type= FF_BUFFER_TYPE_INTERNAL; |
903 | 307 |
1214 | 308 for(i=0; i<4; i++){ |
309 pic->base[i]= buf->base[i]; | |
310 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
|
311 pic->linesize[i]= buf->linesize[i]; |
1214 | 312 } |
313 s->internal_buffer_count++; | |
314 | |
7631
b5b4bf0944b8
Provide a simpler way for the user to reorder her timestamps.
michael
parents:
7613
diff
changeset
|
315 pic->reordered_opaque= s->reordered_opaque; |
b5b4bf0944b8
Provide a simpler way for the user to reorder her timestamps.
michael
parents:
7613
diff
changeset
|
316 |
7406
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
317 if(s->debug&FF_DEBUG_BUFFERS) |
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
318 av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p, %d buffers used\n", pic, s->internal_buffer_count); |
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
319 |
903 | 320 return 0; |
321 } | |
322 | |
925 | 323 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ |
903 | 324 int i; |
4558 | 325 InternalBuffer *buf, *last; |
1214 | 326 |
924 | 327 assert(pic->type==FF_BUFFER_TYPE_INTERNAL); |
1396 | 328 assert(s->internal_buffer_count); |
1214 | 329 |
1455 | 330 buf = NULL; /* avoids warning */ |
1214 | 331 for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize |
332 buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
333 if(buf->data[0] == pic->data[0]) | |
334 break; | |
335 } | |
336 assert(i < s->internal_buffer_count); | |
337 s->internal_buffer_count--; | |
338 last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
339 | |
4558 | 340 FFSWAP(InternalBuffer, *buf, *last); |
1214 | 341 |
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
342 for(i=0; i<4; i++){ |
903 | 343 pic->data[i]=NULL; |
1214 | 344 // pic->base[i]=NULL; |
345 } | |
903 | 346 //printf("R%X\n", pic->opaque); |
7406
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
347 |
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
348 if(s->debug&FF_DEBUG_BUFFERS) |
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
349 av_log(s, AV_LOG_DEBUG, "default_release_buffer called on pic %p, %d buffers used\n", pic, s->internal_buffer_count); |
903 | 350 } |
351 | |
1630 | 352 int 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 */ | |
4624
6a900f539e2c
Add the prefix "av_" to img_crop(), img_copy() and img_pad(), and rename "img"
takis
parents:
4621
diff
changeset
|
378 av_picture_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width, |
1630 | 379 s->height); |
380 s->release_buffer(s, &temp_pic); // Release old frame | |
381 return 0; | |
382 } | |
383 | |
8129
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
8110
diff
changeset
|
384 int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size){ |
1799 | 385 int i; |
386 | |
387 for(i=0; i<count; i++){ | |
8129
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
8110
diff
changeset
|
388 int r= func(c, (char*)arg + i*size); |
1799 | 389 if(ret) ret[i]= r; |
390 } | |
391 return 0; | |
392 } | |
393 | |
1858 | 394 enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt){ |
998 | 395 return fmt[0]; |
396 } | |
397 | |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
398 void avcodec_get_frame_defaults(AVFrame *pic){ |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
399 memset(pic, 0, sizeof(AVFrame)); |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
400 |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
401 pic->pts= AV_NOPTS_VALUE; |
2488 | 402 pic->key_frame= 1; |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
403 } |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
404 |
925 | 405 AVFrame *avcodec_alloc_frame(void){ |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
406 AVFrame *pic= av_malloc(sizeof(AVFrame)); |
2967 | 407 |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
408 if(pic==NULL) return NULL; |
2967 | 409 |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
410 avcodec_get_frame_defaults(pic); |
2967 | 411 |
903 | 412 return pic; |
413 } | |
414 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
415 int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) |
0 | 416 { |
2806 | 417 int ret= -1; |
2967 | 418 |
2806 | 419 entangled_thread_counter++; |
420 if(entangled_thread_counter != 1){ | |
421 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); | |
422 goto end; | |
423 } | |
0 | 424 |
6069
3670c9e7ff4d
Check for avcodec_open codec parameter == NULL and return error in that case
reimar
parents:
6047
diff
changeset
|
425 if(avctx->codec || !codec) |
2806 | 426 goto end; |
1456
670fca257a69
detect avcodec_open() on an already opened AVCodecContext
michaelni
parents:
1455
diff
changeset
|
427 |
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
428 if (codec->priv_data_size > 0) { |
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
429 avctx->priv_data = av_mallocz(codec->priv_data_size); |
5382
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
430 if (!avctx->priv_data) { |
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
431 ret = AVERROR(ENOMEM); |
2806 | 432 goto end; |
5382
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
433 } |
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
434 } else { |
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
435 avctx->priv_data = NULL; |
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
436 } |
2270 | 437 |
438 if(avctx->coded_width && avctx->coded_height) | |
439 avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | |
440 else if(avctx->width && avctx->height) | |
441 avcodec_set_dimensions(avctx, avctx->width, avctx->height); | |
442 | |
2422 | 443 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)){ |
444 av_freep(&avctx->priv_data); | |
5383
8a28860d54ba
Return AVERROR(EINVAL) when invalid width and/or height are specified to
takis
parents:
5382
diff
changeset
|
445 ret = AVERROR(EINVAL); |
2806 | 446 goto end; |
2422 | 447 } |
448 | |
3159 | 449 avctx->codec = codec; |
450 avctx->codec_id = codec->id; | |
451 avctx->frame_number = 0; | |
4762 | 452 if(avctx->codec->init){ |
4763 | 453 ret = avctx->codec->init(avctx); |
454 if (ret < 0) { | |
455 av_freep(&avctx->priv_data); | |
456 avctx->codec= NULL; | |
457 goto end; | |
458 } | |
4762 | 459 } |
2806 | 460 ret=0; |
461 end: | |
462 entangled_thread_counter--; | |
463 return ret; | |
0 | 464 } |
465 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
466 int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
0 | 467 const short *samples) |
468 { | |
2422 | 469 if(buf_size < FF_MIN_BUFFER_SIZE && 0){ |
4526 | 470 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n"); |
2422 | 471 return -1; |
472 } | |
2091 | 473 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || samples){ |
8756
153d7e5d5a5b
remove useless cast, it does not remove warning, encode prototype must be changed
bcoudurier
parents:
8752
diff
changeset
|
474 int ret = avctx->codec->encode(avctx, buf, buf_size, samples); |
2091 | 475 avctx->frame_number++; |
476 return ret; | |
477 }else | |
478 return 0; | |
0 | 479 } |
480 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
481 int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
925 | 482 const AVFrame *pict) |
0 | 483 { |
2422 | 484 if(buf_size < FF_MIN_BUFFER_SIZE){ |
4526 | 485 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n"); |
2422 | 486 return -1; |
487 } | |
488 if(avcodec_check_dimensions(avctx,avctx->width,avctx->height)) | |
489 return -1; | |
2091 | 490 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || pict){ |
8756
153d7e5d5a5b
remove useless cast, it does not remove warning, encode prototype must be changed
bcoudurier
parents:
8752
diff
changeset
|
491 int ret = avctx->codec->encode(avctx, buf, buf_size, pict); |
2091 | 492 avctx->frame_number++; |
2764 | 493 emms_c(); //needed to avoid an emms_c() call before every return; |
2967 | 494 |
2091 | 495 return ret; |
496 }else | |
497 return 0; | |
0 | 498 } |
499 | |
2967 | 500 int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
2756 | 501 const AVSubtitle *sub) |
502 { | |
503 int ret; | |
8771
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
504 if(sub->start_display_time) { |
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
505 av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n"); |
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
506 return -1; |
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
507 } |
8772
5a9485bd4421
Check that there are subtitle rects to encode in avcodec_encode_subtitle()
superdump
parents:
8771
diff
changeset
|
508 if(sub->num_rects == 0 || !sub->rects) |
5a9485bd4421
Check that there are subtitle rects to encode in avcodec_encode_subtitle()
superdump
parents:
8771
diff
changeset
|
509 return -1; |
8756
153d7e5d5a5b
remove useless cast, it does not remove warning, encode prototype must be changed
bcoudurier
parents:
8752
diff
changeset
|
510 ret = avctx->codec->encode(avctx, buf, buf_size, sub); |
2756 | 511 avctx->frame_number++; |
512 return ret; | |
513 } | |
514 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
515 int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, |
0 | 516 int *got_picture_ptr, |
6318
73c09e922744
Make avcodec_decode_* functions take const input buffers.
michael
parents:
6219
diff
changeset
|
517 const uint8_t *buf, int buf_size) |
0 | 518 { |
519 int ret; | |
2967 | 520 |
2028 | 521 *got_picture_ptr= 0; |
2422 | 522 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)) |
523 return -1; | |
2453 | 524 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){ |
2967 | 525 ret = avctx->codec->decode(avctx, picture, got_picture_ptr, |
2453 | 526 buf, buf_size); |
814 | 527 |
2764 | 528 emms_c(); //needed to avoid an emms_c() call before every return; |
2967 | 529 |
530 if (*got_picture_ptr) | |
2453 | 531 avctx->frame_number++; |
532 }else | |
533 ret= 0; | |
534 | |
0 | 535 return ret; |
536 } | |
537 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
538 int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples, |
0 | 539 int *frame_size_ptr, |
6318
73c09e922744
Make avcodec_decode_* functions take const input buffers.
michael
parents:
6219
diff
changeset
|
540 const uint8_t *buf, int buf_size) |
0 | 541 { |
542 int ret; | |
543 | |
2791 | 544 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){ |
4578
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
545 //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
546 if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){ |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
547 av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE\n"); |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
548 return -1; |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
549 } |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
550 if(*frame_size_ptr < FF_MIN_BUFFER_SIZE || |
5707
c46509aca422
Remove check for input buffer size as it does not guarantee that
kostya
parents:
5706
diff
changeset
|
551 *frame_size_ptr < avctx->channels * avctx->frame_size * sizeof(int16_t)){ |
4578
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
552 av_log(avctx, AV_LOG_ERROR, "buffer %d too small\n", *frame_size_ptr); |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
553 return -1; |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
554 } |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
555 |
2967 | 556 ret = avctx->codec->decode(avctx, samples, frame_size_ptr, |
2791 | 557 buf, buf_size); |
558 avctx->frame_number++; | |
4351 | 559 }else{ |
2791 | 560 ret= 0; |
4351 | 561 *frame_size_ptr=0; |
562 } | |
0 | 563 return ret; |
564 } | |
565 | |
2756 | 566 int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub, |
567 int *got_sub_ptr, | |
568 const uint8_t *buf, int buf_size) | |
569 { | |
570 int ret; | |
571 | |
572 *got_sub_ptr = 0; | |
2967 | 573 ret = avctx->codec->decode(avctx, sub, got_sub_ptr, |
6219
a0a645626940
one "cast discards qualifiers from pointer target type" less
michael
parents:
6184
diff
changeset
|
574 buf, buf_size); |
2756 | 575 if (*got_sub_ptr) |
576 avctx->frame_number++; | |
577 return ret; | |
578 } | |
579 | |
0 | 580 int avcodec_close(AVCodecContext *avctx) |
581 { | |
2806 | 582 entangled_thread_counter++; |
583 if(entangled_thread_counter != 1){ | |
584 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); | |
585 entangled_thread_counter--; | |
586 return -1; | |
587 } | |
588 | |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
589 if (HAVE_THREADS && avctx->thread_opaque) |
5234 | 590 avcodec_thread_free(avctx); |
0 | 591 if (avctx->codec->close) |
592 avctx->codec->close(avctx); | |
1994 | 593 avcodec_default_free_buffers(avctx); |
394 | 594 av_freep(&avctx->priv_data); |
0 | 595 avctx->codec = NULL; |
2806 | 596 entangled_thread_counter--; |
0 | 597 return 0; |
598 } | |
599 | |
600 AVCodec *avcodec_find_encoder(enum CodecID id) | |
601 { | |
602 AVCodec *p; | |
603 p = first_avcodec; | |
604 while (p) { | |
605 if (p->encode != NULL && p->id == id) | |
606 return p; | |
607 p = p->next; | |
608 } | |
609 return NULL; | |
610 } | |
611 | |
177 | 612 AVCodec *avcodec_find_encoder_by_name(const char *name) |
613 { | |
614 AVCodec *p; | |
8016
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
615 if (!name) |
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
616 return NULL; |
177 | 617 p = first_avcodec; |
618 while (p) { | |
619 if (p->encode != NULL && strcmp(name,p->name) == 0) | |
620 return p; | |
621 p = p->next; | |
622 } | |
623 return NULL; | |
624 } | |
625 | |
0 | 626 AVCodec *avcodec_find_decoder(enum CodecID id) |
627 { | |
628 AVCodec *p; | |
629 p = first_avcodec; | |
630 while (p) { | |
631 if (p->decode != NULL && p->id == id) | |
632 return p; | |
633 p = p->next; | |
634 } | |
635 return NULL; | |
636 } | |
637 | |
638 AVCodec *avcodec_find_decoder_by_name(const char *name) | |
639 { | |
640 AVCodec *p; | |
8016
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
641 if (!name) |
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
642 return NULL; |
0 | 643 p = first_avcodec; |
644 while (p) { | |
645 if (p->decode != NULL && strcmp(name,p->name) == 0) | |
646 return p; | |
647 p = p->next; | |
648 } | |
649 return NULL; | |
650 } | |
651 | |
652 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) | |
653 { | |
654 const char *codec_name; | |
655 AVCodec *p; | |
656 char buf1[32]; | |
92 | 657 int bitrate; |
5837 | 658 AVRational display_aspect_ratio; |
0 | 659 |
660 if (encode) | |
661 p = avcodec_find_encoder(enc->codec_id); | |
662 else | |
663 p = avcodec_find_decoder(enc->codec_id); | |
664 | |
665 if (p) { | |
666 codec_name = p->name; | |
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
|
667 } 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
|
668 /* 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
|
669 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
|
670 codec_name = "mpeg2ts"; |
0 | 671 } else if (enc->codec_name[0] != '\0') { |
672 codec_name = enc->codec_name; | |
673 } else { | |
674 /* output avi tags */ | |
2967 | 675 if( isprint(enc->codec_tag&0xFF) && isprint((enc->codec_tag>>8)&0xFF) |
2856 | 676 && isprint((enc->codec_tag>>16)&0xFF) && isprint((enc->codec_tag>>24)&0xFF)){ |
2967 | 677 snprintf(buf1, sizeof(buf1), "%c%c%c%c / 0x%04X", |
0 | 678 enc->codec_tag & 0xff, |
679 (enc->codec_tag >> 8) & 0xff, | |
680 (enc->codec_tag >> 16) & 0xff, | |
2856 | 681 (enc->codec_tag >> 24) & 0xff, |
682 enc->codec_tag); | |
0 | 683 } else { |
684 snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag); | |
685 } | |
686 codec_name = buf1; | |
687 } | |
688 | |
689 switch(enc->codec_type) { | |
690 case CODEC_TYPE_VIDEO: | |
691 snprintf(buf, buf_size, | |
692 "Video: %s%s", | |
1389 | 693 codec_name, enc->mb_decision ? " (hq)" : ""); |
2636
2344c6713011
print pix_fmt if its known instead of if the raw codec is used
michael
parents:
2635
diff
changeset
|
694 if (enc->pix_fmt != PIX_FMT_NONE) { |
55 | 695 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
696 ", %s", | |
988
001b7d3045e5
moved avcodec_get_chroma_sub_sample() to imgconvert.c
bellard
parents:
963
diff
changeset
|
697 avcodec_get_pix_fmt_name(enc->pix_fmt)); |
55 | 698 } |
0 | 699 if (enc->width) { |
700 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
2884
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
701 ", %dx%d", |
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
702 enc->width, enc->height); |
6466 | 703 if (enc->sample_aspect_ratio.num) { |
6467 | 704 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, |
705 enc->width*enc->sample_aspect_ratio.num, | |
706 enc->height*enc->sample_aspect_ratio.den, | |
707 1024*1024); | |
708 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
709 " [PAR %d:%d DAR %d:%d]", | |
710 enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den, | |
711 display_aspect_ratio.num, display_aspect_ratio.den); | |
6466 | 712 } |
6012 | 713 if(av_log_get_level() >= AV_LOG_DEBUG){ |
8611 | 714 int g= av_gcd(enc->time_base.num, enc->time_base.den); |
2884
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
715 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
716 ", %d/%d", |
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
717 enc->time_base.num/g, enc->time_base.den/g); |
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
718 } |
0 | 719 } |
741 | 720 if (encode) { |
721 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
722 ", q=%d-%d", enc->qmin, enc->qmax); | |
723 } | |
92 | 724 bitrate = enc->bit_rate; |
0 | 725 break; |
726 case CODEC_TYPE_AUDIO: | |
727 snprintf(buf, buf_size, | |
728 "Audio: %s", | |
729 codec_name); | |
730 if (enc->sample_rate) { | |
731 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
8098 | 732 ", %d Hz", enc->sample_rate); |
0 | 733 } |
8098 | 734 av_strlcat(buf, ", ", buf_size); |
735 avcodec_get_channel_layout_string(buf + strlen(buf), buf_size - strlen(buf), enc->channels, enc->channel_layout); | |
7454
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
736 if (enc->sample_fmt != SAMPLE_FMT_NONE) { |
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
737 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
738 ", %s", avcodec_get_sample_fmt_name(enc->sample_fmt)); |
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
739 } |
2967 | 740 |
92 | 741 /* for PCM codecs, compute bitrate directly */ |
742 switch(enc->codec_id) { | |
7613 | 743 case CODEC_ID_PCM_F64BE: |
744 case CODEC_ID_PCM_F64LE: | |
745 bitrate = enc->sample_rate * enc->channels * 64; | |
746 break; | |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
747 case CODEC_ID_PCM_S32LE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
748 case CODEC_ID_PCM_S32BE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
749 case CODEC_ID_PCM_U32LE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
750 case CODEC_ID_PCM_U32BE: |
7409
21770337ff2d
add CODEC_ID_PCM_F32BE (32-bit floating point PCM big endian decoder)
pross
parents:
7406
diff
changeset
|
751 case CODEC_ID_PCM_F32BE: |
7613 | 752 case CODEC_ID_PCM_F32LE: |
2852
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
753 bitrate = enc->sample_rate * enc->channels * 32; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
754 break; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
755 case CODEC_ID_PCM_S24LE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
756 case CODEC_ID_PCM_S24BE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
757 case CODEC_ID_PCM_U24LE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
758 case CODEC_ID_PCM_U24BE: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
759 case CODEC_ID_PCM_S24DAUD: |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
760 bitrate = enc->sample_rate * enc->channels * 24; |
6f7428adc6ad
Support de-/encoding of 24 and 32 bit PCM (from and to internal 16 bit).
reimar
parents:
2840
diff
changeset
|
761 break; |
92 | 762 case CODEC_ID_PCM_S16LE: |
763 case CODEC_ID_PCM_S16BE: | |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5837
diff
changeset
|
764 case CODEC_ID_PCM_S16LE_PLANAR: |
92 | 765 case CODEC_ID_PCM_U16LE: |
766 case CODEC_ID_PCM_U16BE: | |
94 | 767 bitrate = enc->sample_rate * enc->channels * 16; |
92 | 768 break; |
769 case CODEC_ID_PCM_S8: | |
770 case CODEC_ID_PCM_U8: | |
771 case CODEC_ID_PCM_ALAW: | |
772 case CODEC_ID_PCM_MULAW: | |
7475
eaf0ebba81d7
Make avcodec_string() and av_get_bits_per_sample() report the sample size for CODEC_ID_PCM_ZORK
pross
parents:
7454
diff
changeset
|
773 case CODEC_ID_PCM_ZORK: |
94 | 774 bitrate = enc->sample_rate * enc->channels * 8; |
92 | 775 break; |
776 default: | |
777 bitrate = enc->bit_rate; | |
778 break; | |
779 } | |
0 | 780 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
|
781 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
|
782 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
|
783 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
|
784 break; |
2756 | 785 case CODEC_TYPE_SUBTITLE: |
786 snprintf(buf, buf_size, "Subtitle: %s", codec_name); | |
787 bitrate = enc->bit_rate; | |
788 break; | |
6184 | 789 case CODEC_TYPE_ATTACHMENT: |
790 snprintf(buf, buf_size, "Attachment: %s", codec_name); | |
791 bitrate = enc->bit_rate; | |
792 break; | |
0 | 793 default: |
2281 | 794 snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type); |
795 return; | |
0 | 796 } |
741 | 797 if (encode) { |
798 if (enc->flags & CODEC_FLAG_PASS1) | |
799 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
800 ", pass 1"); | |
801 if (enc->flags & CODEC_FLAG_PASS2) | |
802 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
803 ", pass 2"); | |
804 } | |
92 | 805 if (bitrate != 0) { |
2967 | 806 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
92 | 807 ", %d kb/s", bitrate / 1000); |
0 | 808 } |
809 } | |
810 | |
362 | 811 unsigned avcodec_version( void ) |
812 { | |
813 return LIBAVCODEC_VERSION_INT; | |
814 } | |
55 | 815 |
0 | 816 void avcodec_init(void) |
817 { | |
6350 | 818 static int initialized = 0; |
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
819 |
6350 | 820 if (initialized != 0) |
2979 | 821 return; |
6350 | 822 initialized = 1; |
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
823 |
4197 | 824 dsputil_static_init(); |
0 | 825 } |
826 | |
341 | 827 void avcodec_flush_buffers(AVCodecContext *avctx) |
828 { | |
1368 | 829 if(avctx->codec->flush) |
830 avctx->codec->flush(avctx); | |
341 | 831 } |
832 | |
2231 | 833 void avcodec_default_free_buffers(AVCodecContext *s){ |
1214 | 834 int i, j; |
835 | |
836 if(s->internal_buffer==NULL) return; | |
2967 | 837 |
1214 | 838 for(i=0; i<INTERNAL_BUFFER_SIZE; i++){ |
839 InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
840 for(j=0; j<4; j++){ | |
841 av_freep(&buf->base[j]); | |
842 buf->data[j]= NULL; | |
843 } | |
844 } | |
845 av_freep(&s->internal_buffer); | |
2967 | 846 |
1214 | 847 s->internal_buffer_count=0; |
848 } | |
849 | |
1264 | 850 char av_get_pict_type_char(int pict_type){ |
851 switch(pict_type){ | |
6450 | 852 case FF_I_TYPE: return 'I'; |
853 case FF_P_TYPE: return 'P'; | |
854 case FF_B_TYPE: return 'B'; | |
855 case FF_S_TYPE: return 'S'; | |
856 case FF_SI_TYPE:return 'i'; | |
857 case FF_SP_TYPE:return 'p'; | |
6456 | 858 case FF_BI_TYPE:return 'b'; |
6455 | 859 default: return '?'; |
1264 | 860 } |
861 } | |
862 | |
3433 | 863 int av_get_bits_per_sample(enum CodecID codec_id){ |
864 switch(codec_id){ | |
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
865 case CODEC_ID_ADPCM_SBPRO_2: |
3438 | 866 return 2; |
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
867 case CODEC_ID_ADPCM_SBPRO_3: |
3438 | 868 return 3; |
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
869 case CODEC_ID_ADPCM_SBPRO_4: |
3438 | 870 case CODEC_ID_ADPCM_CT: |
871 return 4; | |
3433 | 872 case CODEC_ID_PCM_ALAW: |
873 case CODEC_ID_PCM_MULAW: | |
874 case CODEC_ID_PCM_S8: | |
875 case CODEC_ID_PCM_U8: | |
7475
eaf0ebba81d7
Make avcodec_string() and av_get_bits_per_sample() report the sample size for CODEC_ID_PCM_ZORK
pross
parents:
7454
diff
changeset
|
876 case CODEC_ID_PCM_ZORK: |
3433 | 877 return 8; |
878 case CODEC_ID_PCM_S16BE: | |
879 case CODEC_ID_PCM_S16LE: | |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5837
diff
changeset
|
880 case CODEC_ID_PCM_S16LE_PLANAR: |
3433 | 881 case CODEC_ID_PCM_U16BE: |
882 case CODEC_ID_PCM_U16LE: | |
883 return 16; | |
884 case CODEC_ID_PCM_S24DAUD: | |
885 case CODEC_ID_PCM_S24BE: | |
886 case CODEC_ID_PCM_S24LE: | |
887 case CODEC_ID_PCM_U24BE: | |
888 case CODEC_ID_PCM_U24LE: | |
889 return 24; | |
890 case CODEC_ID_PCM_S32BE: | |
891 case CODEC_ID_PCM_S32LE: | |
892 case CODEC_ID_PCM_U32BE: | |
893 case CODEC_ID_PCM_U32LE: | |
7409
21770337ff2d
add CODEC_ID_PCM_F32BE (32-bit floating point PCM big endian decoder)
pross
parents:
7406
diff
changeset
|
894 case CODEC_ID_PCM_F32BE: |
7613 | 895 case CODEC_ID_PCM_F32LE: |
3433 | 896 return 32; |
7613 | 897 case CODEC_ID_PCM_F64BE: |
898 case CODEC_ID_PCM_F64LE: | |
899 return 64; | |
3433 | 900 default: |
901 return 0; | |
902 } | |
903 } | |
904 | |
5537 | 905 int av_get_bits_per_sample_format(enum SampleFormat sample_fmt) { |
906 switch (sample_fmt) { | |
907 case SAMPLE_FMT_U8: | |
908 return 8; | |
909 case SAMPLE_FMT_S16: | |
910 return 16; | |
911 case SAMPLE_FMT_S32: | |
912 case SAMPLE_FMT_FLT: | |
913 return 32; | |
7612 | 914 case SAMPLE_FMT_DBL: |
915 return 64; | |
5537 | 916 default: |
917 return 0; | |
918 } | |
919 } | |
920 | |
8590 | 921 #if !HAVE_THREADS |
2013
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
922 int avcodec_thread_init(AVCodecContext *s, int thread_count){ |
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
923 return -1; |
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
924 } |
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
925 #endif |
2676 | 926 |
927 unsigned int av_xiphlacing(unsigned char *s, unsigned int v) | |
928 { | |
929 unsigned int n = 0; | |
930 | |
931 while(v >= 0xff) { | |
932 *s++ = 0xff; | |
933 v -= 0xff; | |
934 n++; | |
935 } | |
936 *s = v; | |
937 n++; | |
938 return n; | |
939 } | |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
940 |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
941 /* Wrapper to work around the lack of mkstemp() on mingw/cygin. |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
942 * Also, tries to create file in /tmp first, if possible. |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
943 * *prefix can be a character constant; *filename will be allocated internally. |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
944 * Returns file descriptor of opened file (or -1 on error) |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
945 * and opened file name in **filename. */ |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
946 int av_tempfile(char *prefix, char **filename) { |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
947 int fd=-1; |
8590 | 948 #if !HAVE_MKSTEMP |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
949 *filename = tempnam(".", prefix); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
950 #else |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
951 size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */ |
3372 | 952 *filename = av_malloc(len); |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
953 #endif |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
954 /* -----common section-----*/ |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
955 if (*filename == NULL) { |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
956 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n"); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
957 return -1; |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
958 } |
8590 | 959 #if !HAVE_MKSTEMP |
5285 | 960 fd = open(*filename, O_RDWR | O_BINARY | O_CREAT, 0444); |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
961 #else |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
962 snprintf(*filename, len, "/tmp/%sXXXXXX", prefix); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
963 fd = mkstemp(*filename); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
964 if (fd < 0) { |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
965 snprintf(*filename, len, "./%sXXXXXX", prefix); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
966 fd = mkstemp(*filename); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
967 } |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
968 #endif |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
969 /* -----common section-----*/ |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
970 if (fd < 0) { |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
971 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
972 return -1; |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
973 } |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
974 return fd; /* success */ |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
975 } |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
976 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
977 typedef struct { |
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
978 const char *abbr; |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
979 int width, height; |
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
980 } VideoFrameSizeAbbr; |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
981 |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
982 typedef struct { |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
983 const char *abbr; |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
984 int rate_num, rate_den; |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
985 } VideoFrameRateAbbr; |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
986 |
7129 | 987 static const VideoFrameSizeAbbr video_frame_size_abbrs[] = { |
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
988 { "ntsc", 720, 480 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
989 { "pal", 720, 576 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
990 { "qntsc", 352, 240 }, /* VCD compliant NTSC */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
991 { "qpal", 352, 288 }, /* VCD compliant PAL */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
992 { "sntsc", 640, 480 }, /* square pixel NTSC */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
993 { "spal", 768, 576 }, /* square pixel PAL */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
994 { "film", 352, 240 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
995 { "ntsc-film", 352, 240 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
996 { "sqcif", 128, 96 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
997 { "qcif", 176, 144 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
998 { "cif", 352, 288 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
999 { "4cif", 704, 576 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1000 { "qqvga", 160, 120 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1001 { "qvga", 320, 240 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1002 { "vga", 640, 480 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1003 { "svga", 800, 600 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1004 { "xga", 1024, 768 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1005 { "uxga", 1600,1200 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1006 { "qxga", 2048,1536 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1007 { "sxga", 1280,1024 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1008 { "qsxga", 2560,2048 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1009 { "hsxga", 5120,4096 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1010 { "wvga", 852, 480 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1011 { "wxga", 1366, 768 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1012 { "wsxga", 1600,1024 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1013 { "wuxga", 1920,1200 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1014 { "woxga", 2560,1600 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1015 { "wqsxga", 3200,2048 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1016 { "wquxga", 3840,2400 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1017 { "whsxga", 6400,4096 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1018 { "whuxga", 7680,4800 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1019 { "cga", 320, 200 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1020 { "ega", 640, 350 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1021 { "hd480", 852, 480 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1022 { "hd720", 1280, 720 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1023 { "hd1080", 1920,1080 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1024 }; |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1025 |
7129 | 1026 static const VideoFrameRateAbbr video_frame_rate_abbrs[]= { |
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1027 { "ntsc", 30000, 1001 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1028 { "pal", 25, 1 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1029 { "qntsc", 30000, 1001 }, /* VCD compliant NTSC */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1030 { "qpal", 25, 1 }, /* VCD compliant PAL */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1031 { "sntsc", 30000, 1001 }, /* square pixel NTSC */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1032 { "spal", 25, 1 }, /* square pixel PAL */ |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1033 { "film", 24, 1 }, |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1034 { "ntsc-film", 24000, 1001 }, |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1035 }; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1036 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1037 int av_parse_video_frame_size(int *width_ptr, int *height_ptr, const char *str) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1038 { |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1039 int i; |
8042 | 1040 int n = FF_ARRAY_ELEMS(video_frame_size_abbrs); |
8757
d529e239a510
Remove 'const' qualifier from variable in av_parse_video_frame_size().
bcoudurier
parents:
8756
diff
changeset
|
1041 char *p; |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1042 int frame_width = 0, frame_height = 0; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1043 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1044 for(i=0;i<n;i++) { |
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1045 if (!strcmp(video_frame_size_abbrs[i].abbr, str)) { |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1046 frame_width = video_frame_size_abbrs[i].width; |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1047 frame_height = video_frame_size_abbrs[i].height; |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1048 break; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1049 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1050 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1051 if (i == n) { |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1052 p = str; |
8757
d529e239a510
Remove 'const' qualifier from variable in av_parse_video_frame_size().
bcoudurier
parents:
8756
diff
changeset
|
1053 frame_width = strtol(p, &p, 10); |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1054 if (*p) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1055 p++; |
8757
d529e239a510
Remove 'const' qualifier from variable in av_parse_video_frame_size().
bcoudurier
parents:
8756
diff
changeset
|
1056 frame_height = strtol(p, &p, 10); |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1057 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1058 if (frame_width <= 0 || frame_height <= 0) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1059 return -1; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1060 *width_ptr = frame_width; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1061 *height_ptr = frame_height; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1062 return 0; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1063 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1064 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1065 int av_parse_video_frame_rate(AVRational *frame_rate, const char *arg) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1066 { |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1067 int i; |
8042 | 1068 int n = FF_ARRAY_ELEMS(video_frame_rate_abbrs); |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1069 char* cp; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1070 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1071 /* First, we check our abbreviation table */ |
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1072 for (i = 0; i < n; ++i) |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1073 if (!strcmp(video_frame_rate_abbrs[i].abbr, arg)) { |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1074 frame_rate->num = video_frame_rate_abbrs[i].rate_num; |
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1075 frame_rate->den = video_frame_rate_abbrs[i].rate_den; |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1076 return 0; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1077 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1078 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1079 /* Then, we try to parse it as fraction */ |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1080 cp = strchr(arg, '/'); |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1081 if (!cp) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1082 cp = strchr(arg, ':'); |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1083 if (cp) { |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1084 char* cpp; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1085 frame_rate->num = strtol(arg, &cpp, 10); |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1086 if (cpp != arg || cpp == cp) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1087 frame_rate->den = strtol(cp+1, &cpp, 10); |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1088 else |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1089 frame_rate->num = 0; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1090 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1091 else { |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1092 /* Finally we give up and parse it as double */ |
7826 | 1093 AVRational time_base = av_d2q(strtod(arg, 0), 1001000); |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1094 frame_rate->den = time_base.den; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1095 frame_rate->num = time_base.num; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1096 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1097 if (!frame_rate->num || !frame_rate->den) |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1098 return -1; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1099 else |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1100 return 0; |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1101 } |
7530
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1102 |
8281
f93efc084e41
Make av_log_missing_feature an internal function, and change its name
stefano
parents:
8227
diff
changeset
|
1103 void ff_log_missing_feature(void *avc, const char *feature, int want_sample) |
7530
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1104 { |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1105 av_log(avc, AV_LOG_WARNING, "%s not implemented. Update your FFmpeg " |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1106 "version to the newest one from SVN. If the problem still " |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1107 "occurs, it means that your file has a feature which has not " |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1108 "been implemented.", feature); |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1109 if(want_sample) |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1110 ff_log_ask_for_sample(avc, NULL); |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1111 else |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1112 av_log(avc, AV_LOG_WARNING, "\n"); |
7530
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1113 } |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1114 |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1115 void ff_log_ask_for_sample(void *avc, const char *msg) |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1116 { |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1117 if (msg) |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1118 av_log(avc, AV_LOG_WARNING, "%s ", msg); |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1119 av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample " |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1120 "of this file to ftp://upload.ffmpeg.org/MPlayer/incoming/ " |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1121 "and contact the ffmpeg-devel mailing list.\n"); |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1122 } |