Mercurial > libavcodec.hg
annotate utils.c @ 12494:94eaea836bf4 libavcodec
Check avctx width/height more thoroughly (e.g. all values 0 except width would
have been accepted before).
Also do not fail if they are invalid but instead override them to 0.
This allows decoding e.g. MPEG video when only the container values are corrupted.
For encoding a value of 0,0 of course makes no sense, but was allowed
through before and will be caught by an extra check in the encode function.
author | reimar |
---|---|
date | Wed, 15 Sep 2010 04:46:55 +0000 |
parents | 8cd356429e9f |
children | 776789af0304 |
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 /** |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11629
diff
changeset
|
24 * @file |
1106 | 25 * utils. |
26 */ | |
2967 | 27 |
8110 | 28 #include "libavutil/avstring.h" |
6763 | 29 #include "libavutil/integer.h" |
30 #include "libavutil/crc.h" | |
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
31 #include "libavutil/pixdesc.h" |
12320
035ca6548e29
Use av_fill_image_pointers/linesizes in place of ff_fill_pointer/linesize,
stefano
parents:
12280
diff
changeset
|
32 #include "libavcore/imgutils.h" |
394 | 33 #include "avcodec.h" |
0 | 34 #include "dsputil.h" |
2880 | 35 #include "opt.h" |
6360 | 36 #include "imgconvert.h" |
7454
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
37 #include "audioconvert.h" |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
38 #include "internal.h" |
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
39 #include <stdlib.h> |
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
40 #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
|
41 #include <limits.h> |
2862 | 42 #include <float.h> |
0 | 43 |
2806 | 44 static int volatile entangled_thread_counter=0; |
9742 | 45 int (*ff_lockmgr_cb)(void **mutex, enum AVLockOp op); |
46 static void *codec_mutex; | |
2806 | 47 |
1057 | 48 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
|
49 { |
2967 | 50 if(min_size < *size) |
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
51 return ptr; |
2967 | 52 |
2422 | 53 *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
|
54 |
6532
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
55 ptr= av_realloc(ptr, *size); |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
56 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
|
57 *size= 0; |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
58 |
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
59 return ptr; |
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
60 } |
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
61 |
9415
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
62 void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size) |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
63 { |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
64 void **p = ptr; |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
65 if (min_size < *size) |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
66 return; |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
67 *size= FFMAX(17*min_size/16 + 32, min_size); |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
68 av_free(*p); |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
69 *p = av_malloc(*size); |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
70 if (!*p) *size = 0; |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
71 } |
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
72 |
0 | 73 /* encoder management */ |
7992 | 74 static AVCodec *first_avcodec = NULL; |
0 | 75 |
6011 | 76 AVCodec *av_codec_next(AVCodec *c){ |
77 if(c) return c->next; | |
78 else return first_avcodec; | |
79 } | |
80 | |
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
81 void avcodec_register(AVCodec *codec) |
0 | 82 { |
83 AVCodec **p; | |
8325 | 84 avcodec_init(); |
0 | 85 p = &first_avcodec; |
86 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
|
87 *p = codec; |
343f0476fd1d
Use a more explicit "codec" rather than "format" as the parameter of
stefano
parents:
8281
diff
changeset
|
88 codec->next = NULL; |
0 | 89 } |
90 | |
8752
7fd1422a8703
Drop the deprecated function register_avcodec() at the next major
stefano
parents:
8750
diff
changeset
|
91 #if LIBAVCODEC_VERSION_MAJOR < 53 |
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
92 void register_avcodec(AVCodec *codec) |
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
93 { |
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
94 avcodec_register(codec); |
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
95 } |
8752
7fd1422a8703
Drop the deprecated function register_avcodec() at the next major
stefano
parents:
8750
diff
changeset
|
96 #endif |
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
97 |
11567
1025297f5624
Add function to export EDGE_WIDTH from libavcodec.
koorogi
parents:
11560
diff
changeset
|
98 unsigned avcodec_get_edge_width(void) |
1025297f5624
Add function to export EDGE_WIDTH from libavcodec.
koorogi
parents:
11560
diff
changeset
|
99 { |
1025297f5624
Add function to export EDGE_WIDTH from libavcodec.
koorogi
parents:
11560
diff
changeset
|
100 return EDGE_WIDTH; |
1025297f5624
Add function to export EDGE_WIDTH from libavcodec.
koorogi
parents:
11560
diff
changeset
|
101 } |
1025297f5624
Add function to export EDGE_WIDTH from libavcodec.
koorogi
parents:
11560
diff
changeset
|
102 |
2270 | 103 void avcodec_set_dimensions(AVCodecContext *s, int width, int height){ |
104 s->coded_width = width; | |
105 s->coded_height= height; | |
106 s->width = -((-width )>>s->lowres); | |
107 s->height= -((-height)>>s->lowres); | |
108 } | |
109 | |
1214 | 110 typedef struct InternalBuffer{ |
903 | 111 int last_pic_num; |
1214 | 112 uint8_t *base[4]; |
903 | 113 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
|
114 int linesize[4]; |
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
115 int width, height; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
116 enum PixelFormat pix_fmt; |
1214 | 117 }InternalBuffer; |
118 | |
119 #define INTERNAL_BUFFER_SIZE 32 | |
903 | 120 |
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
121 void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int linesize_align[4]){ |
2967 | 122 int w_align= 1; |
123 int h_align= 1; | |
124 | |
1538 | 125 switch(s->pix_fmt){ |
126 case PIX_FMT_YUV420P: | |
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4453
diff
changeset
|
127 case PIX_FMT_YUYV422: |
2137
ef47c0b1ff28
UYVY support patch by ("Todd.Kirby" <doubleshot at pacbell dot net>)
michael
parents:
2125
diff
changeset
|
128 case PIX_FMT_UYVY422: |
1538 | 129 case PIX_FMT_YUV422P: |
10549 | 130 case PIX_FMT_YUV440P: |
1538 | 131 case PIX_FMT_YUV444P: |
132 case PIX_FMT_GRAY8: | |
4066 | 133 case PIX_FMT_GRAY16BE: |
134 case PIX_FMT_GRAY16LE: | |
1538 | 135 case PIX_FMT_YUVJ420P: |
136 case PIX_FMT_YUVJ422P: | |
10549 | 137 case PIX_FMT_YUVJ440P: |
1538 | 138 case PIX_FMT_YUVJ444P: |
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
139 case PIX_FMT_YUVA420P: |
1538 | 140 w_align= 16; //FIXME check for non mpeg style codecs and use less alignment |
141 h_align= 16; | |
10549 | 142 if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP) |
9379
d31c367da415
Make sure mpeg2 has its height rounded up to 32 as that is needed
michael
parents:
9355
diff
changeset
|
143 h_align= 32; // interlaced is rounded up to 2 MBs |
1538 | 144 break; |
145 case PIX_FMT_YUV411P: | |
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4453
diff
changeset
|
146 case PIX_FMT_UYYVYY411: |
1538 | 147 w_align=32; |
148 h_align=8; | |
149 break; | |
150 case PIX_FMT_YUV410P: | |
151 if(s->codec_id == CODEC_ID_SVQ1){ | |
152 w_align=64; | |
153 h_align=64; | |
154 } | |
2104 | 155 case PIX_FMT_RGB555: |
156 if(s->codec_id == CODEC_ID_RPZA){ | |
157 w_align=4; | |
158 h_align=4; | |
159 } | |
160 case PIX_FMT_PAL8: | |
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
161 case PIX_FMT_BGR8: |
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
162 case PIX_FMT_RGB8: |
2104 | 163 if(s->codec_id == CODEC_ID_SMC){ |
164 w_align=4; | |
165 h_align=4; | |
166 } | |
1538 | 167 break; |
2418
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
168 case PIX_FMT_BGR24: |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
169 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
|
170 w_align=4; |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
171 h_align=4; |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
172 } |
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
173 break; |
1538 | 174 default: |
175 w_align= 1; | |
176 h_align= 1; | |
177 break; | |
178 } | |
179 | |
9686
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9545
diff
changeset
|
180 *width = FFALIGN(*width , w_align); |
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9545
diff
changeset
|
181 *height= FFALIGN(*height, h_align); |
7942
64f35acc2407
Allocate 1 line more in the chroma plane for H.264, this avoids some
michael
parents:
7941
diff
changeset
|
182 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
|
183 *height+=2; // some of the optimized chroma MC reads one line too much |
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
184 |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
185 linesize_align[0] = |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
186 linesize_align[1] = |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
187 linesize_align[2] = |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
188 linesize_align[3] = STRIDE_ALIGN; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
189 //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
190 //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
191 //picture size unneccessarily in some cases. The solution here is not |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
192 //pretty and better ideas are welcome! |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
193 #if HAVE_MMX |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
194 if(s->codec_id == CODEC_ID_SVQ1 || s->codec_id == CODEC_ID_VP5 || |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
195 s->codec_id == CODEC_ID_VP6 || s->codec_id == CODEC_ID_VP6F || |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
196 s->codec_id == CODEC_ID_VP6A) { |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
197 linesize_align[0] = |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
198 linesize_align[1] = |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
199 linesize_align[2] = 16; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
200 } |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
201 #endif |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
202 } |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
203 |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
204 void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
205 int chroma_shift = av_pix_fmt_descriptors[s->pix_fmt].log2_chroma_w; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
206 int linesize_align[4]; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
207 int align; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
208 avcodec_align_dimensions2(s, width, height, linesize_align); |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
209 align = FFMAX(linesize_align[0], linesize_align[3]); |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
210 linesize_align[1] <<= chroma_shift; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
211 linesize_align[2] <<= chroma_shift; |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
212 align = FFMAX3(align, linesize_align[1], linesize_align[2]); |
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
213 *width=FFALIGN(*width, align); |
1538 | 214 } |
215 | |
12371
5dffb531b1cc
Deprecate avcodec_check_dimensions() in favor of the new function
stefano
parents:
12320
diff
changeset
|
216 #if LIBAVCODEC_VERSION_MAJOR < 53 |
2422 | 217 int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h){ |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
218 return av_image_check_size(w, h, 0, av_log_ctx); |
2422 | 219 } |
12371
5dffb531b1cc
Deprecate avcodec_check_dimensions() in favor of the new function
stefano
parents:
12320
diff
changeset
|
220 #endif |
2422 | 221 |
925 | 222 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
903 | 223 int i; |
1538 | 224 int w= s->width; |
225 int h= s->height; | |
1214 | 226 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
|
227 int *picture_number; |
2422 | 228 |
4453
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
229 if(pic->data[0]!=NULL) { |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
230 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
|
231 return -1; |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
232 } |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
233 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
|
234 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
|
235 return -1; |
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
236 } |
903 | 237 |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
238 if(av_image_check_size(w, h, 0, s)) |
2422 | 239 return -1; |
240 | |
1214 | 241 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
|
242 s->internal_buffer= av_mallocz((INTERNAL_BUFFER_SIZE+1)*sizeof(InternalBuffer)); |
1214 | 243 } |
244 #if 0 | |
245 s->internal_buffer= av_fast_realloc( | |
2967 | 246 s->internal_buffer, |
247 &s->internal_buffer_size, | |
1214 | 248 sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/ |
249 ); | |
250 #endif | |
2967 | 251 |
1214 | 252 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
|
253 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
|
254 (*picture_number)++; |
2967 | 255 |
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
256 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
|
257 for(i=0; i<4; i++){ |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
258 av_freep(&buf->base[i]); |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
259 buf->data[i]= NULL; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
260 } |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
261 } |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
262 |
1214 | 263 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
|
264 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
|
265 buf->last_pic_num= *picture_number; |
903 | 266 }else{ |
1538 | 267 int h_chroma_shift, v_chroma_shift; |
6360 | 268 int size[4] = {0}; |
269 int tmpsize; | |
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
270 int unaligned; |
2950 | 271 AVPicture picture; |
7941
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
272 int stride_align[4]; |
2950 | 273 |
903 | 274 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); |
1538 | 275 |
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
276 avcodec_align_dimensions2(s, &w, &h, stride_align); |
2967 | 277 |
903 | 278 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ |
279 w+= EDGE_WIDTH*2; | |
280 h+= EDGE_WIDTH*2; | |
281 } | |
4986 | 282 |
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
283 do { |
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
284 // NOTE: do not align linesizes individually, this breaks e.g. assumptions |
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
285 // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2 |
12471
d821f7c64fc9
Remove use of deprecated functions av_image_fill_pointers/linesizes in
stefano
parents:
12462
diff
changeset
|
286 av_image_fill_linesizes(picture.linesize, s->pix_fmt, w); |
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
287 // increase alignment of w for next try (rhs gives the lowest bit set in w) |
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
288 w += w & ~(w-1); |
6360 | 289 |
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
290 unaligned = 0; |
9193 | 291 for (i=0; i<4; i++){ |
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
292 unaligned |= picture.linesize[i] % stride_align[i]; |
9193 | 293 } |
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
294 } while (unaligned); |
6360 | 295 |
12471
d821f7c64fc9
Remove use of deprecated functions av_image_fill_pointers/linesizes in
stefano
parents:
12462
diff
changeset
|
296 tmpsize = av_image_fill_pointers(picture.data, s->pix_fmt, h, NULL, picture.linesize); |
9014
1de11a984fc6
Check return value of ff_fill_pointer in avcodec_default_get_buffer,
reimar
parents:
9011
diff
changeset
|
297 if (tmpsize < 0) |
1de11a984fc6
Check return value of ff_fill_pointer in avcodec_default_get_buffer,
reimar
parents:
9011
diff
changeset
|
298 return -1; |
6360 | 299 |
300 for (i=0; i<3 && picture.data[i+1]; i++) | |
301 size[i] = picture.data[i+1] - picture.data[i]; | |
6390 | 302 size[i] = tmpsize - (picture.data[i] - picture.data[0]); |
2950 | 303 |
1214 | 304 buf->last_pic_num= -256*256*256*64; |
2950 | 305 memset(buf->base, 0, sizeof(buf->base)); |
306 memset(buf->data, 0, sizeof(buf->data)); | |
903 | 307 |
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
308 for(i=0; i<4 && size[i]; i++){ |
1165 | 309 const int h_shift= i==0 ? 0 : h_chroma_shift; |
310 const int v_shift= i==0 ? 0 : v_chroma_shift; | |
903 | 311 |
2950 | 312 buf->linesize[i]= picture.linesize[i]; |
903 | 313 |
2950 | 314 buf->base[i]= av_malloc(size[i]+16); //FIXME 16 |
1214 | 315 if(buf->base[i]==NULL) return -1; |
2950 | 316 memset(buf->base[i], 128, size[i]); |
317 | |
11781 | 318 // no edge if EDGE EMU or not planar YUV |
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
319 if((s->flags&CODEC_FLAG_EMU_EDGE) || !size[2]) |
1214 | 320 buf->data[i] = buf->base[i]; |
903 | 321 else |
9686
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9545
diff
changeset
|
322 buf->data[i] = buf->base[i] + FFALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), stride_align[i]); |
903 | 323 } |
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
324 if(size[1] && !size[2]) |
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
325 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
|
326 buf->width = s->width; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
327 buf->height = s->height; |
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
328 buf->pix_fmt= s->pix_fmt; |
903 | 329 pic->age= 256*256*256*64; |
330 } | |
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
|
331 pic->type= FF_BUFFER_TYPE_INTERNAL; |
903 | 332 |
1214 | 333 for(i=0; i<4; i++){ |
334 pic->base[i]= buf->base[i]; | |
335 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
|
336 pic->linesize[i]= buf->linesize[i]; |
1214 | 337 } |
338 s->internal_buffer_count++; | |
339 | |
7631
b5b4bf0944b8
Provide a simpler way for the user to reorder her timestamps.
michael
parents:
7613
diff
changeset
|
340 pic->reordered_opaque= s->reordered_opaque; |
b5b4bf0944b8
Provide a simpler way for the user to reorder her timestamps.
michael
parents:
7613
diff
changeset
|
341 |
7406
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
342 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
|
343 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
|
344 |
903 | 345 return 0; |
346 } | |
347 | |
925 | 348 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ |
903 | 349 int i; |
4558 | 350 InternalBuffer *buf, *last; |
1214 | 351 |
924 | 352 assert(pic->type==FF_BUFFER_TYPE_INTERNAL); |
1396 | 353 assert(s->internal_buffer_count); |
1214 | 354 |
1455 | 355 buf = NULL; /* avoids warning */ |
1214 | 356 for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize |
357 buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
358 if(buf->data[0] == pic->data[0]) | |
359 break; | |
360 } | |
361 assert(i < s->internal_buffer_count); | |
362 s->internal_buffer_count--; | |
363 last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
364 | |
4558 | 365 FFSWAP(InternalBuffer, *buf, *last); |
1214 | 366 |
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
367 for(i=0; i<4; i++){ |
903 | 368 pic->data[i]=NULL; |
1214 | 369 // pic->base[i]=NULL; |
370 } | |
903 | 371 //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
|
372 |
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
373 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
|
374 av_log(s, AV_LOG_DEBUG, "default_release_buffer called on pic %p, %d buffers used\n", pic, s->internal_buffer_count); |
903 | 375 } |
376 | |
1630 | 377 int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){ |
378 AVFrame temp_pic; | |
379 int i; | |
380 | |
381 /* If no picture return a new buffer */ | |
382 if(pic->data[0] == NULL) { | |
383 /* We will copy from buffer, so must be readable */ | |
384 pic->buffer_hints |= FF_BUFFER_HINTS_READABLE; | |
385 return s->get_buffer(s, pic); | |
386 } | |
387 | |
388 /* If internal buffer type return the same buffer */ | |
10684
7e316791ac7b
Set reordered_opaque in default_reget_buffer() with internal buffers.
michael
parents:
10550
diff
changeset
|
389 if(pic->type == FF_BUFFER_TYPE_INTERNAL) { |
7e316791ac7b
Set reordered_opaque in default_reget_buffer() with internal buffers.
michael
parents:
10550
diff
changeset
|
390 pic->reordered_opaque= s->reordered_opaque; |
1630 | 391 return 0; |
10684
7e316791ac7b
Set reordered_opaque in default_reget_buffer() with internal buffers.
michael
parents:
10550
diff
changeset
|
392 } |
1630 | 393 |
394 /* | |
395 * Not internal type and reget_buffer not overridden, emulate cr buffer | |
396 */ | |
397 temp_pic = *pic; | |
398 for(i = 0; i < 4; i++) | |
399 pic->data[i] = pic->base[i] = NULL; | |
400 pic->opaque = NULL; | |
401 /* Allocate new frame */ | |
402 if (s->get_buffer(s, pic)) | |
403 return -1; | |
404 /* 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
|
405 av_picture_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width, |
1630 | 406 s->height); |
407 s->release_buffer(s, &temp_pic); // Release old frame | |
408 return 0; | |
409 } | |
410 | |
8129
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
8110
diff
changeset
|
411 int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size){ |
1799 | 412 int i; |
413 | |
414 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
|
415 int r= func(c, (char*)arg + i*size); |
1799 | 416 if(ret) ret[i]= r; |
417 } | |
418 return 0; | |
419 } | |
420 | |
10386
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
421 int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int jobnr, int threadnr),void *arg, int *ret, int count){ |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
422 int i; |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
423 |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
424 for(i=0; i<count; i++){ |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
425 int r= func(c, arg, i, 0); |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
426 if(ret) ret[i]= r; |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
427 } |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
428 return 0; |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
429 } |
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
430 |
9011
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
8772
diff
changeset
|
431 enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt){ |
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
8772
diff
changeset
|
432 while (*fmt != PIX_FMT_NONE && ff_is_hwaccel_pix_fmt(*fmt)) |
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
8772
diff
changeset
|
433 ++fmt; |
998 | 434 return fmt[0]; |
435 } | |
436 | |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
437 void avcodec_get_frame_defaults(AVFrame *pic){ |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
438 memset(pic, 0, sizeof(AVFrame)); |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
439 |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
440 pic->pts= AV_NOPTS_VALUE; |
2488 | 441 pic->key_frame= 1; |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
442 } |
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
443 |
925 | 444 AVFrame *avcodec_alloc_frame(void){ |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
445 AVFrame *pic= av_malloc(sizeof(AVFrame)); |
2967 | 446 |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
447 if(pic==NULL) return NULL; |
2967 | 448 |
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
449 avcodec_get_frame_defaults(pic); |
2967 | 450 |
903 | 451 return pic; |
452 } | |
453 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
454 int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) |
0 | 455 { |
2806 | 456 int ret= -1; |
2967 | 457 |
9742 | 458 /* If there is a user-supplied mutex locking routine, call it. */ |
459 if (ff_lockmgr_cb) { | |
460 if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN)) | |
461 return -1; | |
462 } | |
463 | |
2806 | 464 entangled_thread_counter++; |
465 if(entangled_thread_counter != 1){ | |
466 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); | |
467 goto end; | |
468 } | |
0 | 469 |
6069
3670c9e7ff4d
Check for avcodec_open codec parameter == NULL and return error in that case
reimar
parents:
6047
diff
changeset
|
470 if(avctx->codec || !codec) |
2806 | 471 goto end; |
1456
670fca257a69
detect avcodec_open() on an already opened AVCodecContext
michaelni
parents:
1455
diff
changeset
|
472 |
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
473 if (codec->priv_data_size > 0) { |
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
474 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
|
475 if (!avctx->priv_data) { |
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
476 ret = AVERROR(ENOMEM); |
2806 | 477 goto end; |
5382
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
478 } |
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
479 } else { |
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
480 avctx->priv_data = NULL; |
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
481 } |
2270 | 482 |
483 if(avctx->coded_width && avctx->coded_height) | |
484 avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | |
485 else if(avctx->width && avctx->height) | |
486 avcodec_set_dimensions(avctx, avctx->width, avctx->height); | |
487 | |
12494
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
488 if ((avctx->coded_width || avctx->coded_height || avctx->width || avctx->height) |
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
489 && ( av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx) < 0 |
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
490 || av_image_check_size(avctx->width, avctx->height, 0, avctx) < 0)) { |
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
491 av_log(avctx, AV_LOG_WARNING, "ignoring invalid width/height values\n"); |
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
492 avcodec_set_dimensions(avctx, 0, 0); |
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
493 } |
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
494 |
10179
0ac7e80ecc76
perform sanity check on number of audio channels in avcodec_open()
pross
parents:
9891
diff
changeset
|
495 #define SANE_NB_CHANNELS 128U |
12494
94eaea836bf4
Check avctx width/height more thoroughly (e.g. all values 0 except width would
reimar
parents:
12489
diff
changeset
|
496 if (avctx->channels > SANE_NB_CHANNELS) { |
5383
8a28860d54ba
Return AVERROR(EINVAL) when invalid width and/or height are specified to
takis
parents:
5382
diff
changeset
|
497 ret = AVERROR(EINVAL); |
10255
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
498 goto free_and_end; |
2422 | 499 } |
500 | |
3159 | 501 avctx->codec = codec; |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
502 if ((avctx->codec_type == AVMEDIA_TYPE_UNKNOWN || avctx->codec_type == codec->type) && |
10345
294c444866f7
Make avcodec_open set codec_id and codec_type if they haven't been set.
reimar
parents:
10255
diff
changeset
|
503 avctx->codec_id == CODEC_ID_NONE) { |
294c444866f7
Make avcodec_open set codec_id and codec_type if they haven't been set.
reimar
parents:
10255
diff
changeset
|
504 avctx->codec_type = codec->type; |
294c444866f7
Make avcodec_open set codec_id and codec_type if they haven't been set.
reimar
parents:
10255
diff
changeset
|
505 avctx->codec_id = codec->id; |
294c444866f7
Make avcodec_open set codec_id and codec_type if they haven't been set.
reimar
parents:
10255
diff
changeset
|
506 } |
10229
bd1c4a438c7f
Check codec_id and codec_type in avcodec_open(), based on 43_codec_type_mismatch.patch from chrome
michael
parents:
10201
diff
changeset
|
507 if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){ |
bd1c4a438c7f
Check codec_id and codec_type in avcodec_open(), based on 43_codec_type_mismatch.patch from chrome
michael
parents:
10201
diff
changeset
|
508 av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n"); |
10255
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
509 goto free_and_end; |
10229
bd1c4a438c7f
Check codec_id and codec_type in avcodec_open(), based on 43_codec_type_mismatch.patch from chrome
michael
parents:
10201
diff
changeset
|
510 } |
3159 | 511 avctx->frame_number = 0; |
12489 | 512 if (avctx->codec->max_lowres < avctx->lowres) { |
513 av_log(avctx, AV_LOG_ERROR, "The maximum value for lowres supported by the decoder is %d\n", | |
514 avctx->codec->max_lowres); | |
515 goto free_and_end; | |
516 } | |
517 | |
4762 | 518 if(avctx->codec->init){ |
4763 | 519 ret = avctx->codec->init(avctx); |
520 if (ret < 0) { | |
10255
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
521 goto free_and_end; |
4763 | 522 } |
4762 | 523 } |
2806 | 524 ret=0; |
525 end: | |
526 entangled_thread_counter--; | |
9742 | 527 |
528 /* Release any user-supplied mutex. */ | |
529 if (ff_lockmgr_cb) { | |
530 (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | |
531 } | |
2806 | 532 return ret; |
10255
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
533 free_and_end: |
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
534 av_freep(&avctx->priv_data); |
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
535 avctx->codec= NULL; |
b81ec4ac8f96
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
michael
parents:
10229
diff
changeset
|
536 goto end; |
0 | 537 } |
538 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
539 int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
0 | 540 const short *samples) |
541 { | |
2422 | 542 if(buf_size < FF_MIN_BUFFER_SIZE && 0){ |
4526 | 543 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n"); |
2422 | 544 return -1; |
545 } | |
2091 | 546 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
|
547 int ret = avctx->codec->encode(avctx, buf, buf_size, samples); |
2091 | 548 avctx->frame_number++; |
549 return ret; | |
550 }else | |
551 return 0; | |
0 | 552 } |
553 | |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
554 int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
925 | 555 const AVFrame *pict) |
0 | 556 { |
2422 | 557 if(buf_size < FF_MIN_BUFFER_SIZE){ |
4526 | 558 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n"); |
2422 | 559 return -1; |
560 } | |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
561 if(av_image_check_size(avctx->width, avctx->height, 0, avctx)) |
2422 | 562 return -1; |
2091 | 563 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
|
564 int ret = avctx->codec->encode(avctx, buf, buf_size, pict); |
2091 | 565 avctx->frame_number++; |
2764 | 566 emms_c(); //needed to avoid an emms_c() call before every return; |
2967 | 567 |
2091 | 568 return ret; |
569 }else | |
570 return 0; | |
0 | 571 } |
572 | |
2967 | 573 int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
2756 | 574 const AVSubtitle *sub) |
575 { | |
576 int ret; | |
8771
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
577 if(sub->start_display_time) { |
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
578 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
|
579 return -1; |
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
580 } |
8772
5a9485bd4421
Check that there are subtitle rects to encode in avcodec_encode_subtitle()
superdump
parents:
8771
diff
changeset
|
581 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
|
582 return -1; |
8756
153d7e5d5a5b
remove useless cast, it does not remove warning, encode prototype must be changed
bcoudurier
parents:
8752
diff
changeset
|
583 ret = avctx->codec->encode(avctx, buf, buf_size, sub); |
2756 | 584 avctx->frame_number++; |
585 return ret; | |
586 } | |
587 | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
588 #if LIBAVCODEC_VERSION_MAJOR < 53 |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
589 int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, |
0 | 590 int *got_picture_ptr, |
6318
73c09e922744
Make avcodec_decode_* functions take const input buffers.
michael
parents:
6219
diff
changeset
|
591 const uint8_t *buf, int buf_size) |
0 | 592 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
593 AVPacket avpkt; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
594 av_init_packet(&avpkt); |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
595 avpkt.data = buf; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
596 avpkt.size = buf_size; |
9787 | 597 // HACK for CorePNG to decode as normal PNG by default |
598 avpkt.flags = AV_PKT_FLAG_KEY; | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
599 |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
600 return avcodec_decode_video2(avctx, picture, got_picture_ptr, &avpkt); |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
601 } |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
602 #endif |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
603 |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
604 int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
605 int *got_picture_ptr, |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
606 AVPacket *avpkt) |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
607 { |
0 | 608 int ret; |
2967 | 609 |
2028 | 610 *got_picture_ptr= 0; |
12462
ffb3668ff7af
Use new imgutils.h API names, fix deprecation warnings.
stefano
parents:
12372
diff
changeset
|
611 if((avctx->coded_width||avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx)) |
2422 | 612 return -1; |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
613 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){ |
2967 | 614 ret = avctx->codec->decode(avctx, picture, got_picture_ptr, |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
615 avpkt); |
814 | 616 |
2764 | 617 emms_c(); //needed to avoid an emms_c() call before every return; |
2967 | 618 |
619 if (*got_picture_ptr) | |
2453 | 620 avctx->frame_number++; |
621 }else | |
622 ret= 0; | |
623 | |
0 | 624 return ret; |
625 } | |
626 | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
627 #if LIBAVCODEC_VERSION_MAJOR < 53 |
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
628 int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples, |
0 | 629 int *frame_size_ptr, |
6318
73c09e922744
Make avcodec_decode_* functions take const input buffers.
michael
parents:
6219
diff
changeset
|
630 const uint8_t *buf, int buf_size) |
0 | 631 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
632 AVPacket avpkt; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
633 av_init_packet(&avpkt); |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
634 avpkt.data = buf; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
635 avpkt.size = buf_size; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
636 |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
637 return avcodec_decode_audio3(avctx, samples, frame_size_ptr, &avpkt); |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
638 } |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
639 #endif |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
640 |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
641 int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
642 int *frame_size_ptr, |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
643 AVPacket *avpkt) |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
644 { |
0 | 645 int ret; |
646 | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
647 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){ |
4578
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
648 //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
|
649 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
|
650 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
|
651 return -1; |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
652 } |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
653 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
|
654 *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
|
655 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
|
656 return -1; |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
657 } |
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
658 |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
659 ret = avctx->codec->decode(avctx, samples, frame_size_ptr, avpkt); |
2791 | 660 avctx->frame_number++; |
4351 | 661 }else{ |
2791 | 662 ret= 0; |
4351 | 663 *frame_size_ptr=0; |
664 } | |
0 | 665 return ret; |
666 } | |
667 | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
668 #if LIBAVCODEC_VERSION_MAJOR < 53 |
2756 | 669 int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub, |
670 int *got_sub_ptr, | |
671 const uint8_t *buf, int buf_size) | |
672 { | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
673 AVPacket avpkt; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
674 av_init_packet(&avpkt); |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
675 avpkt.data = buf; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
676 avpkt.size = buf_size; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
677 |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
678 return avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, &avpkt); |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
679 } |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
680 #endif |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
681 |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
682 int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
683 int *got_sub_ptr, |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
684 AVPacket *avpkt) |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
685 { |
2756 | 686 int ret; |
687 | |
688 *got_sub_ptr = 0; | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
689 ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt); |
2756 | 690 if (*got_sub_ptr) |
691 avctx->frame_number++; | |
692 return ret; | |
693 } | |
694 | |
12134 | 695 void avsubtitle_free(AVSubtitle *sub) |
696 { | |
697 int i; | |
698 | |
699 for (i = 0; i < sub->num_rects; i++) | |
700 { | |
12137
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
701 av_freep(&sub->rects[i]->pict.data[0]); |
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
702 av_freep(&sub->rects[i]->pict.data[1]); |
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
703 av_freep(&sub->rects[i]->pict.data[2]); |
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
704 av_freep(&sub->rects[i]->pict.data[3]); |
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
705 av_freep(&sub->rects[i]->text); |
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
706 av_freep(&sub->rects[i]->ass); |
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
707 av_freep(&sub->rects[i]); |
12134 | 708 } |
709 | |
12137
b8a0924d6e42
100l, change avsubtitle_free to the actually tested and working version.
reimar
parents:
12134
diff
changeset
|
710 av_freep(&sub->rects); |
12134 | 711 |
712 memset(sub, 0, sizeof(AVSubtitle)); | |
713 } | |
714 | |
10867 | 715 av_cold int avcodec_close(AVCodecContext *avctx) |
0 | 716 { |
9742 | 717 /* If there is a user-supplied mutex locking routine, call it. */ |
718 if (ff_lockmgr_cb) { | |
719 if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN)) | |
720 return -1; | |
721 } | |
722 | |
2806 | 723 entangled_thread_counter++; |
724 if(entangled_thread_counter != 1){ | |
725 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); | |
726 entangled_thread_counter--; | |
727 return -1; | |
728 } | |
729 | |
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
730 if (HAVE_THREADS && avctx->thread_opaque) |
5234 | 731 avcodec_thread_free(avctx); |
10505
e7f082df2d65
Add a NULL pointer check to avcodec_close() this should prevent a segfault
michael
parents:
10501
diff
changeset
|
732 if (avctx->codec && avctx->codec->close) |
0 | 733 avctx->codec->close(avctx); |
1994 | 734 avcodec_default_free_buffers(avctx); |
11712
25ed71436974
Set coded_frame to NULL when closing a codec, since it might
reimar
parents:
11659
diff
changeset
|
735 avctx->coded_frame = NULL; |
394 | 736 av_freep(&avctx->priv_data); |
11585 | 737 if(avctx->codec && avctx->codec->encode) |
11223
a090d10c314f
Free encoder extradata in avcodec_close(). Should fix several small memory
vitor
parents:
11134
diff
changeset
|
738 av_freep(&avctx->extradata); |
0 | 739 avctx->codec = NULL; |
2806 | 740 entangled_thread_counter--; |
9742 | 741 |
742 /* Release any user-supplied mutex. */ | |
743 if (ff_lockmgr_cb) { | |
744 (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | |
745 } | |
0 | 746 return 0; |
747 } | |
748 | |
749 AVCodec *avcodec_find_encoder(enum CodecID id) | |
750 { | |
11771
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
751 AVCodec *p, *experimental=NULL; |
0 | 752 p = first_avcodec; |
753 while (p) { | |
11771
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
754 if (p->encode != NULL && p->id == id) { |
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
755 if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) { |
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
756 experimental = p; |
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
757 } else |
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
758 return p; |
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
759 } |
0 | 760 p = p->next; |
761 } | |
11771
3c0dffc64d86
Add CODEC_CAP_EXPERIMENTAL and prefer encoders without it.
cehoyos
parents:
11742
diff
changeset
|
762 return experimental; |
0 | 763 } |
764 | |
177 | 765 AVCodec *avcodec_find_encoder_by_name(const char *name) |
766 { | |
767 AVCodec *p; | |
8016
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
768 if (!name) |
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
769 return NULL; |
177 | 770 p = first_avcodec; |
771 while (p) { | |
772 if (p->encode != NULL && strcmp(name,p->name) == 0) | |
773 return p; | |
774 p = p->next; | |
775 } | |
776 return NULL; | |
777 } | |
778 | |
0 | 779 AVCodec *avcodec_find_decoder(enum CodecID id) |
780 { | |
781 AVCodec *p; | |
782 p = first_avcodec; | |
783 while (p) { | |
784 if (p->decode != NULL && p->id == id) | |
785 return p; | |
786 p = p->next; | |
787 } | |
788 return NULL; | |
789 } | |
790 | |
791 AVCodec *avcodec_find_decoder_by_name(const char *name) | |
792 { | |
793 AVCodec *p; | |
8016
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
794 if (!name) |
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
795 return NULL; |
0 | 796 p = first_avcodec; |
797 while (p) { | |
798 if (p->decode != NULL && strcmp(name,p->name) == 0) | |
799 return p; | |
800 p = p->next; | |
801 } | |
802 return NULL; | |
803 } | |
804 | |
11323
7089198d1d10
Make av_get_bit_rate() static and remove av_, the function is only used
cehoyos
parents:
11322
diff
changeset
|
805 static int get_bit_rate(AVCodecContext *ctx) |
10550
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
806 { |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
807 int bit_rate; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
808 int bits_per_sample; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
809 |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
810 switch(ctx->codec_type) { |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
811 case AVMEDIA_TYPE_VIDEO: |
11629 | 812 case AVMEDIA_TYPE_DATA: |
813 case AVMEDIA_TYPE_SUBTITLE: | |
814 case AVMEDIA_TYPE_ATTACHMENT: | |
10550
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
815 bit_rate = ctx->bit_rate; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
816 break; |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
817 case AVMEDIA_TYPE_AUDIO: |
10550
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
818 bits_per_sample = av_get_bits_per_sample(ctx->codec_id); |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
819 bit_rate = bits_per_sample ? ctx->sample_rate * ctx->channels * bits_per_sample : ctx->bit_rate; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
820 break; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
821 default: |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
822 bit_rate = 0; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
823 break; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
824 } |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
825 return bit_rate; |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
826 } |
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
827 |
11809
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
828 size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag) |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
829 { |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
830 int i, len, ret = 0; |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
831 |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
832 for (i = 0; i < 4; i++) { |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
833 len = snprintf(buf, buf_size, |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
834 isprint(codec_tag&0xFF) ? "%c" : "[%d]", codec_tag&0xFF); |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
835 buf += len; |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
836 buf_size = buf_size > len ? buf_size - len : 0; |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
837 ret += len; |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
838 codec_tag>>=8; |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
839 } |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
840 return ret; |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
841 } |
867d82f512df
Implement av_get_codec_tag_string() and use it in ffprobe.
stefano
parents:
11781
diff
changeset
|
842 |
0 | 843 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) |
844 { | |
845 const char *codec_name; | |
846 AVCodec *p; | |
847 char buf1[32]; | |
92 | 848 int bitrate; |
5837 | 849 AVRational display_aspect_ratio; |
0 | 850 |
851 if (encode) | |
852 p = avcodec_find_encoder(enc->codec_id); | |
853 else | |
854 p = avcodec_find_decoder(enc->codec_id); | |
855 | |
856 if (p) { | |
857 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
|
858 } 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
|
859 /* 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
|
860 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
|
861 codec_name = "mpeg2ts"; |
0 | 862 } else if (enc->codec_name[0] != '\0') { |
863 codec_name = enc->codec_name; | |
864 } else { | |
865 /* output avi tags */ | |
11810
2ae71694d6ae
Make avcodec_string() use av_get_codec_tag_string().
stefano
parents:
11809
diff
changeset
|
866 char tag_buf[32]; |
2ae71694d6ae
Make avcodec_string() use av_get_codec_tag_string().
stefano
parents:
11809
diff
changeset
|
867 av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag); |
2ae71694d6ae
Make avcodec_string() use av_get_codec_tag_string().
stefano
parents:
11809
diff
changeset
|
868 snprintf(buf1, sizeof(buf1), "%s / 0x%04X", tag_buf, enc->codec_tag); |
0 | 869 codec_name = buf1; |
870 } | |
871 | |
872 switch(enc->codec_type) { | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
873 case AVMEDIA_TYPE_VIDEO: |
0 | 874 snprintf(buf, buf_size, |
875 "Video: %s%s", | |
1389 | 876 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
|
877 if (enc->pix_fmt != PIX_FMT_NONE) { |
55 | 878 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
879 ", %s", | |
988
001b7d3045e5
moved avcodec_get_chroma_sub_sample() to imgconvert.c
bellard
parents:
963
diff
changeset
|
880 avcodec_get_pix_fmt_name(enc->pix_fmt)); |
55 | 881 } |
0 | 882 if (enc->width) { |
883 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
|
884 ", %dx%d", |
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
885 enc->width, enc->height); |
6466 | 886 if (enc->sample_aspect_ratio.num) { |
6467 | 887 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, |
888 enc->width*enc->sample_aspect_ratio.num, | |
889 enc->height*enc->sample_aspect_ratio.den, | |
890 1024*1024); | |
891 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
892 " [PAR %d:%d DAR %d:%d]", | |
893 enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den, | |
894 display_aspect_ratio.num, display_aspect_ratio.den); | |
6466 | 895 } |
6012 | 896 if(av_log_get_level() >= AV_LOG_DEBUG){ |
8611 | 897 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
|
898 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
|
899 ", %d/%d", |
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
900 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
|
901 } |
0 | 902 } |
741 | 903 if (encode) { |
904 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
905 ", q=%d-%d", enc->qmin, enc->qmax); | |
906 } | |
0 | 907 break; |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
908 case AVMEDIA_TYPE_AUDIO: |
0 | 909 snprintf(buf, buf_size, |
910 "Audio: %s", | |
911 codec_name); | |
912 if (enc->sample_rate) { | |
913 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
8098 | 914 ", %d Hz", enc->sample_rate); |
0 | 915 } |
8098 | 916 av_strlcat(buf, ", ", buf_size); |
917 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
|
918 if (enc->sample_fmt != SAMPLE_FMT_NONE) { |
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
919 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
920 ", %s", avcodec_get_sample_fmt_name(enc->sample_fmt)); |
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
921 } |
0 | 922 break; |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
923 case AVMEDIA_TYPE_DATA: |
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
|
924 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
|
925 break; |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
926 case AVMEDIA_TYPE_SUBTITLE: |
2756 | 927 snprintf(buf, buf_size, "Subtitle: %s", codec_name); |
928 break; | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11323
diff
changeset
|
929 case AVMEDIA_TYPE_ATTACHMENT: |
6184 | 930 snprintf(buf, buf_size, "Attachment: %s", codec_name); |
931 break; | |
0 | 932 default: |
2281 | 933 snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type); |
934 return; | |
0 | 935 } |
741 | 936 if (encode) { |
937 if (enc->flags & CODEC_FLAG_PASS1) | |
938 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
939 ", pass 1"); | |
940 if (enc->flags & CODEC_FLAG_PASS2) | |
941 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
942 ", pass 2"); | |
943 } | |
11323
7089198d1d10
Make av_get_bit_rate() static and remove av_, the function is only used
cehoyos
parents:
11322
diff
changeset
|
944 bitrate = get_bit_rate(enc); |
92 | 945 if (bitrate != 0) { |
2967 | 946 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
92 | 947 ", %d kb/s", bitrate / 1000); |
0 | 948 } |
949 } | |
950 | |
362 | 951 unsigned avcodec_version( void ) |
952 { | |
953 return LIBAVCODEC_VERSION_INT; | |
954 } | |
55 | 955 |
10764
4546d91de818
Prefer "*FUNC_NAME(" over "* FUNC_NAME(" for XXX_configuration() and
stefano
parents:
10684
diff
changeset
|
956 const char *avcodec_configuration(void) |
10536
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
957 { |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
958 return FFMPEG_CONFIGURATION; |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
959 } |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
960 |
10764
4546d91de818
Prefer "*FUNC_NAME(" over "* FUNC_NAME(" for XXX_configuration() and
stefano
parents:
10684
diff
changeset
|
961 const char *avcodec_license(void) |
10536
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
962 { |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
963 #define LICENSE_PREFIX "libavcodec license: " |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
964 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1; |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
965 } |
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
966 |
0 | 967 void avcodec_init(void) |
968 { | |
6350 | 969 static int initialized = 0; |
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
970 |
6350 | 971 if (initialized != 0) |
2979 | 972 return; |
6350 | 973 initialized = 1; |
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
974 |
4197 | 975 dsputil_static_init(); |
0 | 976 } |
977 | |
341 | 978 void avcodec_flush_buffers(AVCodecContext *avctx) |
979 { | |
1368 | 980 if(avctx->codec->flush) |
981 avctx->codec->flush(avctx); | |
341 | 982 } |
983 | |
2231 | 984 void avcodec_default_free_buffers(AVCodecContext *s){ |
1214 | 985 int i, j; |
986 | |
987 if(s->internal_buffer==NULL) return; | |
2967 | 988 |
10398
11b685acd280
Print a warning message when avcodec_default_free_buffers finds unreleased
reimar
parents:
10386
diff
changeset
|
989 if (s->internal_buffer_count) |
11b685acd280
Print a warning message when avcodec_default_free_buffers finds unreleased
reimar
parents:
10386
diff
changeset
|
990 av_log(s, AV_LOG_WARNING, "Found %i unreleased buffers!\n", s->internal_buffer_count); |
1214 | 991 for(i=0; i<INTERNAL_BUFFER_SIZE; i++){ |
992 InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
993 for(j=0; j<4; j++){ | |
994 av_freep(&buf->base[j]); | |
995 buf->data[j]= NULL; | |
996 } | |
997 } | |
998 av_freep(&s->internal_buffer); | |
2967 | 999 |
1214 | 1000 s->internal_buffer_count=0; |
1001 } | |
1002 | |
1264 | 1003 char av_get_pict_type_char(int pict_type){ |
1004 switch(pict_type){ | |
6450 | 1005 case FF_I_TYPE: return 'I'; |
1006 case FF_P_TYPE: return 'P'; | |
1007 case FF_B_TYPE: return 'B'; | |
1008 case FF_S_TYPE: return 'S'; | |
1009 case FF_SI_TYPE:return 'i'; | |
1010 case FF_SP_TYPE:return 'p'; | |
6456 | 1011 case FF_BI_TYPE:return 'b'; |
6455 | 1012 default: return '?'; |
1264 | 1013 } |
1014 } | |
1015 | |
3433 | 1016 int av_get_bits_per_sample(enum CodecID codec_id){ |
1017 switch(codec_id){ | |
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
1018 case CODEC_ID_ADPCM_SBPRO_2: |
3438 | 1019 return 2; |
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
1020 case CODEC_ID_ADPCM_SBPRO_3: |
3438 | 1021 return 3; |
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
1022 case CODEC_ID_ADPCM_SBPRO_4: |
3438 | 1023 case CODEC_ID_ADPCM_CT: |
10779 | 1024 case CODEC_ID_ADPCM_IMA_WAV: |
10777
c4e157b47af5
Handle more ADPCM codecs in av_get_bits_per_sample().
daniel
parents:
10764
diff
changeset
|
1025 case CODEC_ID_ADPCM_MS: |
c4e157b47af5
Handle more ADPCM codecs in av_get_bits_per_sample().
daniel
parents:
10764
diff
changeset
|
1026 case CODEC_ID_ADPCM_YAMAHA: |
3438 | 1027 return 4; |
3433 | 1028 case CODEC_ID_PCM_ALAW: |
1029 case CODEC_ID_PCM_MULAW: | |
1030 case CODEC_ID_PCM_S8: | |
1031 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
|
1032 case CODEC_ID_PCM_ZORK: |
3433 | 1033 return 8; |
1034 case CODEC_ID_PCM_S16BE: | |
1035 case CODEC_ID_PCM_S16LE: | |
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5837
diff
changeset
|
1036 case CODEC_ID_PCM_S16LE_PLANAR: |
3433 | 1037 case CODEC_ID_PCM_U16BE: |
1038 case CODEC_ID_PCM_U16LE: | |
1039 return 16; | |
1040 case CODEC_ID_PCM_S24DAUD: | |
1041 case CODEC_ID_PCM_S24BE: | |
1042 case CODEC_ID_PCM_S24LE: | |
1043 case CODEC_ID_PCM_U24BE: | |
1044 case CODEC_ID_PCM_U24LE: | |
1045 return 24; | |
1046 case CODEC_ID_PCM_S32BE: | |
1047 case CODEC_ID_PCM_S32LE: | |
1048 case CODEC_ID_PCM_U32BE: | |
1049 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
|
1050 case CODEC_ID_PCM_F32BE: |
7613 | 1051 case CODEC_ID_PCM_F32LE: |
3433 | 1052 return 32; |
7613 | 1053 case CODEC_ID_PCM_F64BE: |
1054 case CODEC_ID_PCM_F64LE: | |
1055 return 64; | |
3433 | 1056 default: |
1057 return 0; | |
1058 } | |
1059 } | |
1060 | |
5537 | 1061 int av_get_bits_per_sample_format(enum SampleFormat sample_fmt) { |
1062 switch (sample_fmt) { | |
1063 case SAMPLE_FMT_U8: | |
1064 return 8; | |
1065 case SAMPLE_FMT_S16: | |
1066 return 16; | |
1067 case SAMPLE_FMT_S32: | |
1068 case SAMPLE_FMT_FLT: | |
1069 return 32; | |
7612 | 1070 case SAMPLE_FMT_DBL: |
1071 return 64; | |
5537 | 1072 default: |
1073 return 0; | |
1074 } | |
1075 } | |
1076 | |
8590 | 1077 #if !HAVE_THREADS |
2013
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1078 int avcodec_thread_init(AVCodecContext *s, int thread_count){ |
9545
59073f92f0e2
Make avcodec_thread_init() set the thread count, even in the case when
stefano
parents:
9536
diff
changeset
|
1079 s->thread_count = thread_count; |
2013
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1080 return -1; |
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1081 } |
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1082 #endif |
2676 | 1083 |
1084 unsigned int av_xiphlacing(unsigned char *s, unsigned int v) | |
1085 { | |
1086 unsigned int n = 0; | |
1087 | |
1088 while(v >= 0xff) { | |
1089 *s++ = 0xff; | |
1090 v -= 0xff; | |
1091 n++; | |
1092 } | |
1093 *s = v; | |
1094 n++; | |
1095 return n; | |
1096 } | |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1097 |
12280
fbc6fc80e6c6
Deprecate av_parse_video_frame_size() and av_parse_video_frame_rate()
stefano
parents:
12137
diff
changeset
|
1098 #if LIBAVCODEC_VERSION_MAJOR < 53 |
fbc6fc80e6c6
Deprecate av_parse_video_frame_size() and av_parse_video_frame_rate()
stefano
parents:
12137
diff
changeset
|
1099 #include "libavcore/parseutils.h" |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1100 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1101 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
|
1102 { |
12280
fbc6fc80e6c6
Deprecate av_parse_video_frame_size() and av_parse_video_frame_rate()
stefano
parents:
12137
diff
changeset
|
1103 return av_parse_video_size(width_ptr, height_ptr, str); |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1104 } |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1105 |
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1106 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
|
1107 { |
12280
fbc6fc80e6c6
Deprecate av_parse_video_frame_size() and av_parse_video_frame_rate()
stefano
parents:
12137
diff
changeset
|
1108 return av_parse_video_rate(frame_rate, arg); |
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1109 } |
12280
fbc6fc80e6c6
Deprecate av_parse_video_frame_size() and av_parse_video_frame_rate()
stefano
parents:
12137
diff
changeset
|
1110 #endif |
7530
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1111 |
10832
f20726a6d538
Add a function to match a 2 element vector of uint16_t and use it in h263 and svq1
michael
parents:
10779
diff
changeset
|
1112 int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b){ |
f20726a6d538
Add a function to match a 2 element vector of uint16_t and use it in h263 and svq1
michael
parents:
10779
diff
changeset
|
1113 int i; |
f20726a6d538
Add a function to match a 2 element vector of uint16_t and use it in h263 and svq1
michael
parents:
10779
diff
changeset
|
1114 for(i=0; i<size && !(tab[i][0]==a && tab[i][1]==b); i++); |
f20726a6d538
Add a function to match a 2 element vector of uint16_t and use it in h263 and svq1
michael
parents:
10779
diff
changeset
|
1115 return i; |
f20726a6d538
Add a function to match a 2 element vector of uint16_t and use it in h263 and svq1
michael
parents:
10779
diff
changeset
|
1116 } |
f20726a6d538
Add a function to match a 2 element vector of uint16_t and use it in h263 and svq1
michael
parents:
10779
diff
changeset
|
1117 |
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9787
diff
changeset
|
1118 void av_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
|
1119 { |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1120 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
|
1121 "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
|
1122 "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
|
1123 "been implemented.", feature); |
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1124 if(want_sample) |
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9787
diff
changeset
|
1125 av_log_ask_for_sample(avc, NULL); |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1126 else |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1127 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
|
1128 } |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1129 |
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9787
diff
changeset
|
1130 void av_log_ask_for_sample(void *avc, const char *msg) |
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1131 { |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1132 if (msg) |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1133 av_log(avc, AV_LOG_WARNING, "%s ", msg); |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1134 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
|
1135 "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
|
1136 "and contact the ffmpeg-devel mailing list.\n"); |
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1137 } |
9030 | 1138 |
1139 static AVHWAccel *first_hwaccel = NULL; | |
1140 | |
1141 void av_register_hwaccel(AVHWAccel *hwaccel) | |
1142 { | |
1143 AVHWAccel **p = &first_hwaccel; | |
1144 while (*p) | |
1145 p = &(*p)->next; | |
1146 *p = hwaccel; | |
1147 hwaccel->next = NULL; | |
1148 } | |
9031 | 1149 |
1150 AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel) | |
1151 { | |
1152 return hwaccel ? hwaccel->next : first_hwaccel; | |
1153 } | |
9032 | 1154 |
1155 AVHWAccel *ff_find_hwaccel(enum CodecID codec_id, enum PixelFormat pix_fmt) | |
1156 { | |
1157 AVHWAccel *hwaccel=NULL; | |
1158 | |
1159 while((hwaccel= av_hwaccel_next(hwaccel))){ | |
1160 if ( hwaccel->id == codec_id | |
1161 && hwaccel->pix_fmt == pix_fmt) | |
1162 return hwaccel; | |
1163 } | |
1164 return NULL; | |
1165 } | |
9742 | 1166 |
1167 int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)) | |
1168 { | |
1169 if (ff_lockmgr_cb) { | |
1170 if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY)) | |
1171 return -1; | |
1172 } | |
1173 | |
1174 ff_lockmgr_cb = cb; | |
1175 | |
1176 if (ff_lockmgr_cb) { | |
1177 if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_CREATE)) | |
1178 return -1; | |
1179 } | |
1180 return 0; | |
1181 } | |
11742
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1182 |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1183 unsigned int ff_toupper4(unsigned int x) |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1184 { |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1185 return toupper( x &0xFF) |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1186 + (toupper((x>>8 )&0xFF)<<8 ) |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1187 + (toupper((x>>16)&0xFF)<<16) |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1188 + (toupper((x>>24)&0xFF)<<24); |
a37818ac3817
Factorize some code into the new function ff_toupper4().
cehoyos
parents:
11712
diff
changeset
|
1189 } |