Mercurial > libavcodec.hg
annotate utils.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
| author | conrad |
|---|---|
| date | Wed, 03 Mar 2010 23:27:40 +0000 |
| parents | 7089198d1d10 |
| children | 8a4984c5cacc |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * utils for libavcodec | |
|
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
8611
diff
changeset
|
3 * Copyright (c) 2001 Fabrice Bellard |
|
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1730
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
| 0 | 5 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
6 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
7 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
| 429 | 9 * modify it under the terms of the GNU Lesser General Public |
| 10 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 12 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 16 * Lesser General Public License for more details. | |
| 0 | 17 * |
| 429 | 18 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3916
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3031
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 21 */ |
| 2967 | 22 |
| 1106 | 23 /** |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8629
diff
changeset
|
24 * @file libavcodec/utils.c |
| 1106 | 25 * utils. |
| 26 */ | |
| 2967 | 27 |
|
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
28 /* needed for mkstemp() */ |
| 7936 | 29 #define _XOPEN_SOURCE 600 |
|
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
30 |
| 8110 | 31 #include "libavutil/avstring.h" |
| 6763 | 32 #include "libavutil/integer.h" |
| 33 #include "libavutil/crc.h" | |
|
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
34 #include "libavutil/pixdesc.h" |
| 394 | 35 #include "avcodec.h" |
| 0 | 36 #include "dsputil.h" |
| 2880 | 37 #include "opt.h" |
| 6360 | 38 #include "imgconvert.h" |
|
7454
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
39 #include "audioconvert.h" |
|
11322
c4e86bcb2fee
Include libxvid_internal.h: It contains the prototype for av_tempfile().
cehoyos
parents:
11311
diff
changeset
|
40 #include "libxvid_internal.h" |
|
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
41 #include "internal.h" |
|
7576
e50e9def7428
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
7530
diff
changeset
|
42 #include <stdlib.h> |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1588
diff
changeset
|
43 #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
|
44 #include <limits.h> |
| 2862 | 45 #include <float.h> |
| 8590 | 46 #if !HAVE_MKSTEMP |
|
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
47 #include <fcntl.h> |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
48 #endif |
| 0 | 49 |
| 2806 | 50 static int volatile entangled_thread_counter=0; |
| 9742 | 51 int (*ff_lockmgr_cb)(void **mutex, enum AVLockOp op); |
| 52 static void *codec_mutex; | |
| 2806 | 53 |
| 1057 | 54 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
|
55 { |
| 2967 | 56 if(min_size < *size) |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
57 return ptr; |
| 2967 | 58 |
| 2422 | 59 *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
|
60 |
|
6532
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
61 ptr= av_realloc(ptr, *size); |
|
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
62 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
|
63 *size= 0; |
|
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
64 |
|
8aafb712389e
Fix possible heap overflow caused by av_fast_realloc()
michael
parents:
6488
diff
changeset
|
65 return ptr; |
|
1031
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
66 } |
|
19de1445beb2
use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents:
998
diff
changeset
|
67 |
|
9415
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
68 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
|
69 { |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
70 void **p = ptr; |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
71 if (min_size < *size) |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
72 return; |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
73 *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
|
74 av_free(*p); |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
75 *p = av_malloc(*size); |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
76 if (!*p) *size = 0; |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
77 } |
|
141badec76fc
Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents:
9379
diff
changeset
|
78 |
| 0 | 79 /* encoder management */ |
| 7992 | 80 static AVCodec *first_avcodec = NULL; |
| 0 | 81 |
| 6011 | 82 AVCodec *av_codec_next(AVCodec *c){ |
| 83 if(c) return c->next; | |
| 84 else return first_avcodec; | |
| 85 } | |
| 86 | |
|
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
87 void avcodec_register(AVCodec *codec) |
| 0 | 88 { |
| 89 AVCodec **p; | |
| 8325 | 90 avcodec_init(); |
| 0 | 91 p = &first_avcodec; |
| 92 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
|
93 *p = codec; |
|
343f0476fd1d
Use a more explicit "codec" rather than "format" as the parameter of
stefano
parents:
8281
diff
changeset
|
94 codec->next = NULL; |
| 0 | 95 } |
| 96 | |
|
8752
7fd1422a8703
Drop the deprecated function register_avcodec() at the next major
stefano
parents:
8750
diff
changeset
|
97 #if LIBAVCODEC_VERSION_MAJOR < 53 |
|
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
98 void register_avcodec(AVCodec *codec) |
|
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
99 { |
|
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
100 avcodec_register(codec); |
|
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
101 } |
|
8752
7fd1422a8703
Drop the deprecated function register_avcodec() at the next major
stefano
parents:
8750
diff
changeset
|
102 #endif |
|
8750
2528b6a2b5d3
Rename register_avcodec() as avcodec_register() and deprecate the old
stefano
parents:
8748
diff
changeset
|
103 |
| 2270 | 104 void avcodec_set_dimensions(AVCodecContext *s, int width, int height){ |
| 105 s->coded_width = width; | |
| 106 s->coded_height= height; | |
| 107 s->width = -((-width )>>s->lowres); | |
| 108 s->height= -((-height)>>s->lowres); | |
| 109 } | |
| 110 | |
| 1214 | 111 typedef struct InternalBuffer{ |
| 903 | 112 int last_pic_num; |
| 1214 | 113 uint8_t *base[4]; |
| 903 | 114 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
|
115 int linesize[4]; |
|
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
116 int width, height; |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
117 enum PixelFormat pix_fmt; |
| 1214 | 118 }InternalBuffer; |
| 119 | |
| 120 #define INTERNAL_BUFFER_SIZE 32 | |
| 903 | 121 |
|
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
122 void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int linesize_align[4]){ |
| 2967 | 123 int w_align= 1; |
| 124 int h_align= 1; | |
| 125 | |
| 1538 | 126 switch(s->pix_fmt){ |
| 127 case PIX_FMT_YUV420P: | |
|
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4453
diff
changeset
|
128 case PIX_FMT_YUYV422: |
|
2137
ef47c0b1ff28
UYVY support patch by ("Todd.Kirby" <doubleshot at pacbell dot net>)
michael
parents:
2125
diff
changeset
|
129 case PIX_FMT_UYVY422: |
| 1538 | 130 case PIX_FMT_YUV422P: |
| 10549 | 131 case PIX_FMT_YUV440P: |
| 1538 | 132 case PIX_FMT_YUV444P: |
| 133 case PIX_FMT_GRAY8: | |
| 4066 | 134 case PIX_FMT_GRAY16BE: |
| 135 case PIX_FMT_GRAY16LE: | |
| 1538 | 136 case PIX_FMT_YUVJ420P: |
| 137 case PIX_FMT_YUVJ422P: | |
| 10549 | 138 case PIX_FMT_YUVJ440P: |
| 1538 | 139 case PIX_FMT_YUVJ444P: |
|
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
140 case PIX_FMT_YUVA420P: |
| 1538 | 141 w_align= 16; //FIXME check for non mpeg style codecs and use less alignment |
| 142 h_align= 16; | |
| 10549 | 143 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
|
144 h_align= 32; // interlaced is rounded up to 2 MBs |
| 1538 | 145 break; |
| 146 case PIX_FMT_YUV411P: | |
|
4494
ce643a22f049
Replace deprecated PIX_FMT names by the newer variants.
diego
parents:
4453
diff
changeset
|
147 case PIX_FMT_UYYVYY411: |
| 1538 | 148 w_align=32; |
| 149 h_align=8; | |
| 150 break; | |
| 151 case PIX_FMT_YUV410P: | |
| 152 if(s->codec_id == CODEC_ID_SVQ1){ | |
| 153 w_align=64; | |
| 154 h_align=64; | |
| 155 } | |
| 2104 | 156 case PIX_FMT_RGB555: |
| 157 if(s->codec_id == CODEC_ID_RPZA){ | |
| 158 w_align=4; | |
| 159 h_align=4; | |
| 160 } | |
| 161 case PIX_FMT_PAL8: | |
|
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
162 case PIX_FMT_BGR8: |
|
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
163 case PIX_FMT_RGB8: |
| 2104 | 164 if(s->codec_id == CODEC_ID_SMC){ |
| 165 w_align=4; | |
| 166 h_align=4; | |
| 167 } | |
| 1538 | 168 break; |
|
2418
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
169 case PIX_FMT_BGR24: |
|
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
170 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
|
171 w_align=4; |
|
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
172 h_align=4; |
|
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
173 } |
|
82af834636c2
Check pointers before writing to memory, fix possible integer overflows
rtognimp
parents:
2398
diff
changeset
|
174 break; |
| 1538 | 175 default: |
| 176 w_align= 1; | |
| 177 h_align= 1; | |
| 178 break; | |
| 179 } | |
| 180 | |
|
9686
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9545
diff
changeset
|
181 *width = FFALIGN(*width , w_align); |
|
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9545
diff
changeset
|
182 *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
|
183 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
|
184 *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
|
185 |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
186 linesize_align[0] = |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
187 linesize_align[1] = |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
188 linesize_align[2] = |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
189 linesize_align[3] = STRIDE_ALIGN; |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
190 //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
|
191 //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
|
192 //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
|
193 //pretty and better ideas are welcome! |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
194 #if HAVE_MMX |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
195 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
|
196 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
|
197 s->codec_id == CODEC_ID_VP6A) { |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
198 linesize_align[0] = |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
199 linesize_align[1] = |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
200 linesize_align[2] = 16; |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
201 } |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
202 #endif |
|
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 |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
205 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
|
206 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
|
207 int linesize_align[4]; |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
208 int align; |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
209 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
|
210 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
|
211 linesize_align[1] <<= chroma_shift; |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
212 linesize_align[2] <<= chroma_shift; |
|
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
213 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
|
214 *width=FFALIGN(*width, align); |
| 1538 | 215 } |
| 216 | |
| 2422 | 217 int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h){ |
|
9536
f522c8e05a29
Update safety check as the maximum pixel size is no longer 4.
michael
parents:
9415
diff
changeset
|
218 if((int)w>0 && (int)h>0 && (w+128)*(uint64_t)(h+128) < INT_MAX/8) |
| 2422 | 219 return 0; |
| 2967 | 220 |
| 2422 | 221 av_log(av_log_ctx, AV_LOG_ERROR, "picture size invalid (%ux%u)\n", w, h); |
| 222 return -1; | |
| 223 } | |
| 224 | |
| 925 | 225 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
| 903 | 226 int i; |
| 1538 | 227 int w= s->width; |
| 228 int h= s->height; | |
| 1214 | 229 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
|
230 int *picture_number; |
| 2422 | 231 |
|
4453
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
232 if(pic->data[0]!=NULL) { |
|
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
233 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
|
234 return -1; |
|
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
235 } |
|
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
236 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
|
237 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
|
238 return -1; |
|
22827cd6b228
Activate guards in avcodec_default_get_buffer. Patch by Michel Bardiaux,
takis
parents:
4351
diff
changeset
|
239 } |
| 903 | 240 |
| 2422 | 241 if(avcodec_check_dimensions(s,w,h)) |
| 242 return -1; | |
| 243 | |
| 1214 | 244 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
|
245 s->internal_buffer= av_mallocz((INTERNAL_BUFFER_SIZE+1)*sizeof(InternalBuffer)); |
| 1214 | 246 } |
| 247 #if 0 | |
| 248 s->internal_buffer= av_fast_realloc( | |
| 2967 | 249 s->internal_buffer, |
| 250 &s->internal_buffer_size, | |
| 1214 | 251 sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/ |
| 252 ); | |
| 253 #endif | |
| 2967 | 254 |
| 1214 | 255 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
|
256 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
|
257 (*picture_number)++; |
| 2967 | 258 |
|
5522
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
259 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
|
260 for(i=0; i<4; i++){ |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
261 av_freep(&buf->base[i]); |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
262 buf->data[i]= NULL; |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
263 } |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
264 } |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
265 |
| 1214 | 266 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
|
267 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
|
268 buf->last_pic_num= *picture_number; |
| 903 | 269 }else{ |
| 1538 | 270 int h_chroma_shift, v_chroma_shift; |
| 6360 | 271 int size[4] = {0}; |
| 272 int tmpsize; | |
|
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
273 int unaligned; |
| 2950 | 274 AVPicture picture; |
|
7941
8a3f24796fa9
Replace second (and wrong) call to avcodec_align_dimensions() by adjusting
michael
parents:
7936
diff
changeset
|
275 int stride_align[4]; |
| 2950 | 276 |
| 903 | 277 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); |
| 1538 | 278 |
|
11311
ee2e050815be
Fix avcodec_align_dimensions to return values suitably aligned for FLV decoding
reimar
parents:
11223
diff
changeset
|
279 avcodec_align_dimensions2(s, &w, &h, stride_align); |
| 2967 | 280 |
| 903 | 281 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ |
| 282 w+= EDGE_WIDTH*2; | |
| 283 h+= EDGE_WIDTH*2; | |
| 284 } | |
| 4986 | 285 |
|
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
286 do { |
|
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
287 // 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
|
288 // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2 |
| 9193 | 289 ff_fill_linesize(&picture, s->pix_fmt, w); |
|
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
290 // 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
|
291 w += w & ~(w-1); |
| 6360 | 292 |
|
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
293 unaligned = 0; |
| 9193 | 294 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
|
295 unaligned |= picture.linesize[i] % stride_align[i]; |
| 9193 | 296 } |
|
9192
6faca73d75cc
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
reimar
parents:
9032
diff
changeset
|
297 } while (unaligned); |
| 6360 | 298 |
| 299 tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h); | |
|
9014
1de11a984fc6
Check return value of ff_fill_pointer in avcodec_default_get_buffer,
reimar
parents:
9011
diff
changeset
|
300 if (tmpsize < 0) |
|
1de11a984fc6
Check return value of ff_fill_pointer in avcodec_default_get_buffer,
reimar
parents:
9011
diff
changeset
|
301 return -1; |
| 6360 | 302 |
| 303 for (i=0; i<3 && picture.data[i+1]; i++) | |
| 304 size[i] = picture.data[i+1] - picture.data[i]; | |
| 6390 | 305 size[i] = tmpsize - (picture.data[i] - picture.data[0]); |
| 2950 | 306 |
| 1214 | 307 buf->last_pic_num= -256*256*256*64; |
| 2950 | 308 memset(buf->base, 0, sizeof(buf->base)); |
| 309 memset(buf->data, 0, sizeof(buf->data)); | |
| 903 | 310 |
|
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
311 for(i=0; i<4 && size[i]; i++){ |
| 1165 | 312 const int h_shift= i==0 ? 0 : h_chroma_shift; |
| 313 const int v_shift= i==0 ? 0 : v_chroma_shift; | |
| 903 | 314 |
| 2950 | 315 buf->linesize[i]= picture.linesize[i]; |
| 903 | 316 |
| 2950 | 317 buf->base[i]= av_malloc(size[i]+16); //FIXME 16 |
| 1214 | 318 if(buf->base[i]==NULL) return -1; |
| 2950 | 319 memset(buf->base[i], 128, size[i]); |
| 320 | |
|
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
321 // no edge if EDEG EMU or not planar YUV |
|
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
322 if((s->flags&CODEC_FLAG_EMU_EDGE) || !size[2]) |
| 1214 | 323 buf->data[i] = buf->base[i]; |
| 903 | 324 else |
|
9686
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9545
diff
changeset
|
325 buf->data[i] = buf->base[i] + FFALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), stride_align[i]); |
| 903 | 326 } |
|
8748
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
327 if(size[1] && !size[2]) |
|
eaa08ce79f9a
Ensure that the palette is set in data[1] for all 8bit formats.
michael
parents:
8718
diff
changeset
|
328 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
|
329 buf->width = s->width; |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
330 buf->height = s->height; |
|
acaaff7b6fb8
ensure that default_get_buffer() doesnt reuse images if the dimension or
michael
parents:
5383
diff
changeset
|
331 buf->pix_fmt= s->pix_fmt; |
| 903 | 332 pic->age= 256*256*256*64; |
| 333 } | |
|
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
|
334 pic->type= FF_BUFFER_TYPE_INTERNAL; |
| 903 | 335 |
| 1214 | 336 for(i=0; i<4; i++){ |
| 337 pic->base[i]= buf->base[i]; | |
| 338 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
|
339 pic->linesize[i]= buf->linesize[i]; |
| 1214 | 340 } |
| 341 s->internal_buffer_count++; | |
| 342 | |
|
7631
b5b4bf0944b8
Provide a simpler way for the user to reorder her timestamps.
michael
parents:
7613
diff
changeset
|
343 pic->reordered_opaque= s->reordered_opaque; |
|
b5b4bf0944b8
Provide a simpler way for the user to reorder her timestamps.
michael
parents:
7613
diff
changeset
|
344 |
|
7406
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
345 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
|
346 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
|
347 |
| 903 | 348 return 0; |
| 349 } | |
| 350 | |
| 925 | 351 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ |
| 903 | 352 int i; |
| 4558 | 353 InternalBuffer *buf, *last; |
| 1214 | 354 |
| 924 | 355 assert(pic->type==FF_BUFFER_TYPE_INTERNAL); |
| 1396 | 356 assert(s->internal_buffer_count); |
| 1214 | 357 |
| 1455 | 358 buf = NULL; /* avoids warning */ |
| 1214 | 359 for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize |
| 360 buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
| 361 if(buf->data[0] == pic->data[0]) | |
| 362 break; | |
| 363 } | |
| 364 assert(i < s->internal_buffer_count); | |
| 365 s->internal_buffer_count--; | |
| 366 last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
| 367 | |
| 4558 | 368 FFSWAP(InternalBuffer, *buf, *last); |
| 1214 | 369 |
|
5706
3e8764a25c53
add support for yuva420p colorspace (yuv420p + alpha)
aurel
parents:
5576
diff
changeset
|
370 for(i=0; i<4; i++){ |
| 903 | 371 pic->data[i]=NULL; |
| 1214 | 372 // pic->base[i]=NULL; |
| 373 } | |
| 903 | 374 //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
|
375 |
|
7b2819083061
Add a new -debug option for tracing calls to the default get/release_buffer functions.
astrange
parents:
7331
diff
changeset
|
376 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
|
377 av_log(s, AV_LOG_DEBUG, "default_release_buffer called on pic %p, %d buffers used\n", pic, s->internal_buffer_count); |
| 903 | 378 } |
| 379 | |
| 1630 | 380 int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){ |
| 381 AVFrame temp_pic; | |
| 382 int i; | |
| 383 | |
| 384 /* If no picture return a new buffer */ | |
| 385 if(pic->data[0] == NULL) { | |
| 386 /* We will copy from buffer, so must be readable */ | |
| 387 pic->buffer_hints |= FF_BUFFER_HINTS_READABLE; | |
| 388 return s->get_buffer(s, pic); | |
| 389 } | |
| 390 | |
| 391 /* 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
|
392 if(pic->type == FF_BUFFER_TYPE_INTERNAL) { |
|
7e316791ac7b
Set reordered_opaque in default_reget_buffer() with internal buffers.
michael
parents:
10550
diff
changeset
|
393 pic->reordered_opaque= s->reordered_opaque; |
| 1630 | 394 return 0; |
|
10684
7e316791ac7b
Set reordered_opaque in default_reget_buffer() with internal buffers.
michael
parents:
10550
diff
changeset
|
395 } |
| 1630 | 396 |
| 397 /* | |
| 398 * Not internal type and reget_buffer not overridden, emulate cr buffer | |
| 399 */ | |
| 400 temp_pic = *pic; | |
| 401 for(i = 0; i < 4; i++) | |
| 402 pic->data[i] = pic->base[i] = NULL; | |
| 403 pic->opaque = NULL; | |
| 404 /* Allocate new frame */ | |
| 405 if (s->get_buffer(s, pic)) | |
| 406 return -1; | |
| 407 /* 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
|
408 av_picture_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width, |
| 1630 | 409 s->height); |
| 410 s->release_buffer(s, &temp_pic); // Release old frame | |
| 411 return 0; | |
| 412 } | |
| 413 | |
|
8129
a9734fe0811e
Making it easier to send arbitrary structures as work orders to MT workers
romansh
parents:
8110
diff
changeset
|
414 int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size){ |
| 1799 | 415 int i; |
| 416 | |
| 417 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
|
418 int r= func(c, (char*)arg + i*size); |
| 1799 | 419 if(ret) ret[i]= r; |
| 420 } | |
| 421 return 0; | |
| 422 } | |
| 423 | |
|
10386
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
424 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
|
425 int i; |
|
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
426 |
|
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
427 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
|
428 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
|
429 if(ret) ret[i]= r; |
|
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
430 } |
|
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
431 return 0; |
|
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
432 } |
|
98501365c3aa
Add an execute2 function that is more flexible and allows to use parallel
reimar
parents:
10345
diff
changeset
|
433 |
|
9011
90c99bda19f5
Approved hunks for VAAPI / our new shiny hwaccel API
michael
parents:
8772
diff
changeset
|
434 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
|
435 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
|
436 ++fmt; |
| 998 | 437 return fmt[0]; |
| 438 } | |
| 439 | |
|
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
440 void avcodec_get_frame_defaults(AVFrame *pic){ |
|
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
441 memset(pic, 0, sizeof(AVFrame)); |
|
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 pic->pts= AV_NOPTS_VALUE; |
| 2488 | 444 pic->key_frame= 1; |
|
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
445 } |
|
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
446 |
| 925 | 447 AVFrame *avcodec_alloc_frame(void){ |
|
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
448 AVFrame *pic= av_malloc(sizeof(AVFrame)); |
| 2967 | 449 |
|
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
450 if(pic==NULL) return NULL; |
| 2967 | 451 |
|
1831
cd2d7fcfab7a
use AVFrame.pts=AV_NOPTS_VALUE instead of AVFrame.pts=0
michael
parents:
1823
diff
changeset
|
452 avcodec_get_frame_defaults(pic); |
| 2967 | 453 |
| 903 | 454 return pic; |
| 455 } | |
| 456 | |
|
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
457 int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) |
| 0 | 458 { |
| 2806 | 459 int ret= -1; |
| 2967 | 460 |
| 9742 | 461 /* If there is a user-supplied mutex locking routine, call it. */ |
| 462 if (ff_lockmgr_cb) { | |
| 463 if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN)) | |
| 464 return -1; | |
| 465 } | |
| 466 | |
| 2806 | 467 entangled_thread_counter++; |
| 468 if(entangled_thread_counter != 1){ | |
| 469 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); | |
| 470 goto end; | |
| 471 } | |
| 0 | 472 |
|
6069
3670c9e7ff4d
Check for avcodec_open codec parameter == NULL and return error in that case
reimar
parents:
6047
diff
changeset
|
473 if(avctx->codec || !codec) |
| 2806 | 474 goto end; |
|
1456
670fca257a69
detect avcodec_open() on an already opened AVCodecContext
michaelni
parents:
1455
diff
changeset
|
475 |
|
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
476 if (codec->priv_data_size > 0) { |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
477 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
|
478 if (!avctx->priv_data) { |
|
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
479 ret = AVERROR(ENOMEM); |
| 2806 | 480 goto end; |
|
5382
7f96f6e16f81
Return AVERROR(ENOMEM) on memory allocation failure of avcodec_open.
takis
parents:
5356
diff
changeset
|
481 } |
|
374
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
482 } else { |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
483 avctx->priv_data = NULL; |
|
02147e22f8c8
* Don't allocate 0 bytes of memory. It upsets electricFence!
philipjsg
parents:
362
diff
changeset
|
484 } |
| 2270 | 485 |
| 486 if(avctx->coded_width && avctx->coded_height) | |
| 487 avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height); | |
| 488 else if(avctx->width && avctx->height) | |
| 489 avcodec_set_dimensions(avctx, avctx->width, avctx->height); | |
| 490 | |
|
10179
0ac7e80ecc76
perform sanity check on number of audio channels in avcodec_open()
pross
parents:
9891
diff
changeset
|
491 #define SANE_NB_CHANNELS 128U |
|
10201
1b2ef85867a9
Add parentheses to logical expression to avoid the warning:
diego
parents:
10179
diff
changeset
|
492 if (((avctx->coded_width || avctx->coded_height) |
|
1b2ef85867a9
Add parentheses to logical expression to avoid the warning:
diego
parents:
10179
diff
changeset
|
493 && avcodec_check_dimensions(avctx, avctx->coded_width, avctx->coded_height)) |
|
1b2ef85867a9
Add parentheses to logical expression to avoid the warning:
diego
parents:
10179
diff
changeset
|
494 || avctx->channels > SANE_NB_CHANNELS) { |
|
5383
8a28860d54ba
Return AVERROR(EINVAL) when invalid width and/or height are specified to
takis
parents:
5382
diff
changeset
|
495 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
|
496 goto free_and_end; |
| 2422 | 497 } |
| 498 | |
| 3159 | 499 avctx->codec = codec; |
|
10345
294c444866f7
Make avcodec_open set codec_id and codec_type if they haven't been set.
reimar
parents:
10255
diff
changeset
|
500 if ((avctx->codec_type == CODEC_TYPE_UNKNOWN || 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
|
501 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
|
502 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
|
503 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
|
504 } |
|
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
|
505 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
|
506 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
|
507 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
|
508 } |
| 3159 | 509 avctx->frame_number = 0; |
| 4762 | 510 if(avctx->codec->init){ |
| 4763 | 511 ret = avctx->codec->init(avctx); |
| 512 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
|
513 goto free_and_end; |
| 4763 | 514 } |
| 4762 | 515 } |
| 2806 | 516 ret=0; |
| 517 end: | |
| 518 entangled_thread_counter--; | |
| 9742 | 519 |
| 520 /* Release any user-supplied mutex. */ | |
| 521 if (ff_lockmgr_cb) { | |
| 522 (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | |
| 523 } | |
| 2806 | 524 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
|
525 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
|
526 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
|
527 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
|
528 goto end; |
| 0 | 529 } |
| 530 | |
|
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
531 int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
| 0 | 532 const short *samples) |
| 533 { | |
| 2422 | 534 if(buf_size < FF_MIN_BUFFER_SIZE && 0){ |
| 4526 | 535 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n"); |
| 2422 | 536 return -1; |
| 537 } | |
| 2091 | 538 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
|
539 int ret = avctx->codec->encode(avctx, buf, buf_size, samples); |
| 2091 | 540 avctx->frame_number++; |
| 541 return ret; | |
| 542 }else | |
| 543 return 0; | |
| 0 | 544 } |
| 545 | |
|
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
546 int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
| 925 | 547 const AVFrame *pict) |
| 0 | 548 { |
| 2422 | 549 if(buf_size < FF_MIN_BUFFER_SIZE){ |
| 4526 | 550 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n"); |
| 2422 | 551 return -1; |
| 552 } | |
| 553 if(avcodec_check_dimensions(avctx,avctx->width,avctx->height)) | |
| 554 return -1; | |
| 2091 | 555 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
|
556 int ret = avctx->codec->encode(avctx, buf, buf_size, pict); |
| 2091 | 557 avctx->frame_number++; |
| 2764 | 558 emms_c(); //needed to avoid an emms_c() call before every return; |
| 2967 | 559 |
| 2091 | 560 return ret; |
| 561 }else | |
| 562 return 0; | |
| 0 | 563 } |
| 564 | |
| 2967 | 565 int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
| 2756 | 566 const AVSubtitle *sub) |
| 567 { | |
| 568 int ret; | |
|
8771
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
569 if(sub->start_display_time) { |
|
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
570 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
|
571 return -1; |
|
f7442819cacf
Check that start_display_time is 0 in avcodec_encode_subtitle()
superdump
parents:
8757
diff
changeset
|
572 } |
|
8772
5a9485bd4421
Check that there are subtitle rects to encode in avcodec_encode_subtitle()
superdump
parents:
8771
diff
changeset
|
573 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
|
574 return -1; |
|
8756
153d7e5d5a5b
remove useless cast, it does not remove warning, encode prototype must be changed
bcoudurier
parents:
8752
diff
changeset
|
575 ret = avctx->codec->encode(avctx, buf, buf_size, sub); |
| 2756 | 576 avctx->frame_number++; |
| 577 return ret; | |
| 578 } | |
| 579 | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
580 #if LIBAVCODEC_VERSION_MAJOR < 53 |
|
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
581 int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, |
| 0 | 582 int *got_picture_ptr, |
|
6318
73c09e922744
Make avcodec_decode_* functions take const input buffers.
michael
parents:
6219
diff
changeset
|
583 const uint8_t *buf, int buf_size) |
| 0 | 584 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
585 AVPacket avpkt; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
586 av_init_packet(&avpkt); |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
587 avpkt.data = buf; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
588 avpkt.size = buf_size; |
| 9787 | 589 // HACK for CorePNG to decode as normal PNG by default |
| 590 avpkt.flags = AV_PKT_FLAG_KEY; | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
591 |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
592 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
|
593 } |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
594 #endif |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
595 |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
596 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
|
597 int *got_picture_ptr, |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
598 AVPacket *avpkt) |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
599 { |
| 0 | 600 int ret; |
| 2967 | 601 |
| 2028 | 602 *got_picture_ptr= 0; |
| 2422 | 603 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)) |
| 604 return -1; | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
605 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){ |
| 2967 | 606 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
|
607 avpkt); |
| 814 | 608 |
| 2764 | 609 emms_c(); //needed to avoid an emms_c() call before every return; |
| 2967 | 610 |
| 611 if (*got_picture_ptr) | |
| 2453 | 612 avctx->frame_number++; |
| 613 }else | |
| 614 ret= 0; | |
| 615 | |
| 0 | 616 return ret; |
| 617 } | |
| 618 | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
619 #if LIBAVCODEC_VERSION_MAJOR < 53 |
|
5542
b0a566346fb1
Add attribute that forces alignment of stack to functions that need it.
ramiro
parents:
5537
diff
changeset
|
620 int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples, |
| 0 | 621 int *frame_size_ptr, |
|
6318
73c09e922744
Make avcodec_decode_* functions take const input buffers.
michael
parents:
6219
diff
changeset
|
622 const uint8_t *buf, int buf_size) |
| 0 | 623 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
624 AVPacket avpkt; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
625 av_init_packet(&avpkt); |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
626 avpkt.data = buf; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
627 avpkt.size = buf_size; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
628 |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
629 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
|
630 } |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
631 #endif |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
632 |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
633 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
|
634 int *frame_size_ptr, |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
635 AVPacket *avpkt) |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
636 { |
| 0 | 637 int ret; |
| 638 | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
639 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
|
640 //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
|
641 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
|
642 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
|
643 return -1; |
|
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
644 } |
|
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
645 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
|
646 *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
|
647 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
|
648 return -1; |
|
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
649 } |
|
006563b9ab27
dont check buffer size if the decode function wont be called at all
michael
parents:
4577
diff
changeset
|
650 |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
651 ret = avctx->codec->decode(avctx, samples, frame_size_ptr, avpkt); |
| 2791 | 652 avctx->frame_number++; |
| 4351 | 653 }else{ |
| 2791 | 654 ret= 0; |
| 4351 | 655 *frame_size_ptr=0; |
| 656 } | |
| 0 | 657 return ret; |
| 658 } | |
| 659 | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
660 #if LIBAVCODEC_VERSION_MAJOR < 53 |
| 2756 | 661 int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub, |
| 662 int *got_sub_ptr, | |
| 663 const uint8_t *buf, int buf_size) | |
| 664 { | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
665 AVPacket avpkt; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
666 av_init_packet(&avpkt); |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
667 avpkt.data = buf; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
668 avpkt.size = buf_size; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
669 |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
670 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
|
671 } |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
672 #endif |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
673 |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
674 int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
675 int *got_sub_ptr, |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
676 AVPacket *avpkt) |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
677 { |
| 2756 | 678 int ret; |
| 679 | |
| 680 *got_sub_ptr = 0; | |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9328
diff
changeset
|
681 ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt); |
| 2756 | 682 if (*got_sub_ptr) |
| 683 avctx->frame_number++; | |
| 684 return ret; | |
| 685 } | |
| 686 | |
| 10867 | 687 av_cold int avcodec_close(AVCodecContext *avctx) |
| 0 | 688 { |
| 9742 | 689 /* If there is a user-supplied mutex locking routine, call it. */ |
| 690 if (ff_lockmgr_cb) { | |
| 691 if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN)) | |
| 692 return -1; | |
| 693 } | |
| 694 | |
| 2806 | 695 entangled_thread_counter++; |
| 696 if(entangled_thread_counter != 1){ | |
| 697 av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); | |
| 698 entangled_thread_counter--; | |
| 699 return -1; | |
| 700 } | |
| 701 | |
|
8596
68e959302527
replace all occurrence of ENABLE_ by the corresponding CONFIG_, HAVE_ or ARCH_
aurel
parents:
8590
diff
changeset
|
702 if (HAVE_THREADS && avctx->thread_opaque) |
| 5234 | 703 avcodec_thread_free(avctx); |
|
10505
e7f082df2d65
Add a NULL pointer check to avcodec_close() this should prevent a segfault
michael
parents:
10501
diff
changeset
|
704 if (avctx->codec && avctx->codec->close) |
| 0 | 705 avctx->codec->close(avctx); |
| 1994 | 706 avcodec_default_free_buffers(avctx); |
| 394 | 707 av_freep(&avctx->priv_data); |
|
11223
a090d10c314f
Free encoder extradata in avcodec_close(). Should fix several small memory
vitor
parents:
11134
diff
changeset
|
708 if(avctx->codec->encode) |
|
a090d10c314f
Free encoder extradata in avcodec_close(). Should fix several small memory
vitor
parents:
11134
diff
changeset
|
709 av_freep(&avctx->extradata); |
| 0 | 710 avctx->codec = NULL; |
| 2806 | 711 entangled_thread_counter--; |
| 9742 | 712 |
| 713 /* Release any user-supplied mutex. */ | |
| 714 if (ff_lockmgr_cb) { | |
| 715 (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | |
| 716 } | |
| 0 | 717 return 0; |
| 718 } | |
| 719 | |
| 720 AVCodec *avcodec_find_encoder(enum CodecID id) | |
| 721 { | |
| 722 AVCodec *p; | |
| 723 p = first_avcodec; | |
| 724 while (p) { | |
| 725 if (p->encode != NULL && p->id == id) | |
| 726 return p; | |
| 727 p = p->next; | |
| 728 } | |
| 729 return NULL; | |
| 730 } | |
| 731 | |
| 177 | 732 AVCodec *avcodec_find_encoder_by_name(const char *name) |
| 733 { | |
| 734 AVCodec *p; | |
|
8016
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
735 if (!name) |
|
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
736 return NULL; |
| 177 | 737 p = first_avcodec; |
| 738 while (p) { | |
| 739 if (p->encode != NULL && strcmp(name,p->name) == 0) | |
| 740 return p; | |
| 741 p = p->next; | |
| 742 } | |
| 743 return NULL; | |
| 744 } | |
| 745 | |
| 0 | 746 AVCodec *avcodec_find_decoder(enum CodecID id) |
| 747 { | |
| 748 AVCodec *p; | |
| 749 p = first_avcodec; | |
| 750 while (p) { | |
| 751 if (p->decode != NULL && p->id == id) | |
| 752 return p; | |
| 753 p = p->next; | |
| 754 } | |
| 755 return NULL; | |
| 756 } | |
| 757 | |
| 758 AVCodec *avcodec_find_decoder_by_name(const char *name) | |
| 759 { | |
| 760 AVCodec *p; | |
|
8016
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
761 if (!name) |
|
81dba4c59fd6
allows calling avcodec_find_(en|de)coder_by_name with NULL parameter
aurel
parents:
7992
diff
changeset
|
762 return NULL; |
| 0 | 763 p = first_avcodec; |
| 764 while (p) { | |
| 765 if (p->decode != NULL && strcmp(name,p->name) == 0) | |
| 766 return p; | |
| 767 p = p->next; | |
| 768 } | |
| 769 return NULL; | |
| 770 } | |
| 771 | |
|
11323
7089198d1d10
Make av_get_bit_rate() static and remove av_, the function is only used
cehoyos
parents:
11322
diff
changeset
|
772 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
|
773 { |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
774 int bit_rate; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
775 int bits_per_sample; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
776 |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
777 switch(ctx->codec_type) { |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
778 case CODEC_TYPE_VIDEO: |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
779 bit_rate = ctx->bit_rate; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
780 break; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
781 case CODEC_TYPE_AUDIO: |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
782 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
|
783 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
|
784 break; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
785 case CODEC_TYPE_DATA: |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
786 bit_rate = ctx->bit_rate; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
787 break; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
788 case CODEC_TYPE_SUBTITLE: |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
789 bit_rate = ctx->bit_rate; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
790 break; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
791 case CODEC_TYPE_ATTACHMENT: |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
792 bit_rate = ctx->bit_rate; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
793 break; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
794 default: |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
795 bit_rate = 0; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
796 break; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
797 } |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
798 return bit_rate; |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
799 } |
|
eb415f52f9f9
Factorize av_get_bit_rate (for future use outside of libavcodec).
cehoyos
parents:
10549
diff
changeset
|
800 |
| 0 | 801 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) |
| 802 { | |
| 803 const char *codec_name; | |
| 804 AVCodec *p; | |
| 805 char buf1[32]; | |
| 92 | 806 int bitrate; |
| 5837 | 807 AVRational display_aspect_ratio; |
| 0 | 808 |
| 809 if (encode) | |
| 810 p = avcodec_find_encoder(enc->codec_id); | |
| 811 else | |
| 812 p = avcodec_find_decoder(enc->codec_id); | |
| 813 | |
| 814 if (p) { | |
| 815 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
|
816 } 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
|
817 /* 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
|
818 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
|
819 codec_name = "mpeg2ts"; |
| 0 | 820 } else if (enc->codec_name[0] != '\0') { |
| 821 codec_name = enc->codec_name; | |
| 822 } else { | |
| 823 /* output avi tags */ | |
| 2967 | 824 if( isprint(enc->codec_tag&0xFF) && isprint((enc->codec_tag>>8)&0xFF) |
| 2856 | 825 && isprint((enc->codec_tag>>16)&0xFF) && isprint((enc->codec_tag>>24)&0xFF)){ |
| 2967 | 826 snprintf(buf1, sizeof(buf1), "%c%c%c%c / 0x%04X", |
| 0 | 827 enc->codec_tag & 0xff, |
| 828 (enc->codec_tag >> 8) & 0xff, | |
| 829 (enc->codec_tag >> 16) & 0xff, | |
| 2856 | 830 (enc->codec_tag >> 24) & 0xff, |
| 831 enc->codec_tag); | |
| 0 | 832 } else { |
| 833 snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag); | |
| 834 } | |
| 835 codec_name = buf1; | |
| 836 } | |
| 837 | |
| 838 switch(enc->codec_type) { | |
| 839 case CODEC_TYPE_VIDEO: | |
| 840 snprintf(buf, buf_size, | |
| 841 "Video: %s%s", | |
| 1389 | 842 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
|
843 if (enc->pix_fmt != PIX_FMT_NONE) { |
| 55 | 844 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
| 845 ", %s", | |
|
988
001b7d3045e5
moved avcodec_get_chroma_sub_sample() to imgconvert.c
bellard
parents:
963
diff
changeset
|
846 avcodec_get_pix_fmt_name(enc->pix_fmt)); |
| 55 | 847 } |
| 0 | 848 if (enc->width) { |
| 849 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
|
850 ", %dx%d", |
|
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
851 enc->width, enc->height); |
| 6466 | 852 if (enc->sample_aspect_ratio.num) { |
| 6467 | 853 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den, |
| 854 enc->width*enc->sample_aspect_ratio.num, | |
| 855 enc->height*enc->sample_aspect_ratio.den, | |
| 856 1024*1024); | |
| 857 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 858 " [PAR %d:%d DAR %d:%d]", | |
| 859 enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den, | |
| 860 display_aspect_ratio.num, display_aspect_ratio.den); | |
| 6466 | 861 } |
| 6012 | 862 if(av_log_get_level() >= AV_LOG_DEBUG){ |
| 8611 | 863 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
|
864 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
|
865 ", %d/%d", |
|
a332778dfa06
print more time_base fps stuff if av_log level is at debug or above
michael
parents:
2881
diff
changeset
|
866 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
|
867 } |
| 0 | 868 } |
| 741 | 869 if (encode) { |
| 870 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 871 ", q=%d-%d", enc->qmin, enc->qmax); | |
| 872 } | |
| 0 | 873 break; |
| 874 case CODEC_TYPE_AUDIO: | |
| 875 snprintf(buf, buf_size, | |
| 876 "Audio: %s", | |
| 877 codec_name); | |
| 878 if (enc->sample_rate) { | |
| 879 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 8098 | 880 ", %d Hz", enc->sample_rate); |
| 0 | 881 } |
| 8098 | 882 av_strlcat(buf, ", ", buf_size); |
| 883 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
|
884 if (enc->sample_fmt != SAMPLE_FMT_NONE) { |
|
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
885 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
|
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
886 ", %s", avcodec_get_sample_fmt_name(enc->sample_fmt)); |
|
bb5e8cae1d71
Write sample format description within avcodec_string()
pross
parents:
7409
diff
changeset
|
887 } |
| 0 | 888 break; |
|
1582
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
889 case CODEC_TYPE_DATA: |
|
ece0ad14a35d
added fake codec CODEC_ID_MPEG2TS of type CODEC_TYPE_DATA (needed for simpler handling of raw transport streams in ffserver and RTP - better solutions are welcomed)
bellard
parents:
1549
diff
changeset
|
890 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
|
891 break; |
| 2756 | 892 case CODEC_TYPE_SUBTITLE: |
| 893 snprintf(buf, buf_size, "Subtitle: %s", codec_name); | |
| 894 break; | |
| 6184 | 895 case CODEC_TYPE_ATTACHMENT: |
| 896 snprintf(buf, buf_size, "Attachment: %s", codec_name); | |
| 897 break; | |
| 0 | 898 default: |
| 2281 | 899 snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type); |
| 900 return; | |
| 0 | 901 } |
| 741 | 902 if (encode) { |
| 903 if (enc->flags & CODEC_FLAG_PASS1) | |
| 904 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 905 ", pass 1"); | |
| 906 if (enc->flags & CODEC_FLAG_PASS2) | |
| 907 snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
| 908 ", pass 2"); | |
| 909 } | |
|
11323
7089198d1d10
Make av_get_bit_rate() static and remove av_, the function is only used
cehoyos
parents:
11322
diff
changeset
|
910 bitrate = get_bit_rate(enc); |
| 92 | 911 if (bitrate != 0) { |
| 2967 | 912 snprintf(buf + strlen(buf), buf_size - strlen(buf), |
| 92 | 913 ", %d kb/s", bitrate / 1000); |
| 0 | 914 } |
| 915 } | |
| 916 | |
| 362 | 917 unsigned avcodec_version( void ) |
| 918 { | |
| 919 return LIBAVCODEC_VERSION_INT; | |
| 920 } | |
| 55 | 921 |
|
10764
4546d91de818
Prefer "*FUNC_NAME(" over "* FUNC_NAME(" for XXX_configuration() and
stefano
parents:
10684
diff
changeset
|
922 const char *avcodec_configuration(void) |
|
10536
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
923 { |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
924 return FFMPEG_CONFIGURATION; |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
925 } |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
926 |
|
10764
4546d91de818
Prefer "*FUNC_NAME(" over "* FUNC_NAME(" for XXX_configuration() and
stefano
parents:
10684
diff
changeset
|
927 const char *avcodec_license(void) |
|
10536
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
928 { |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
929 #define LICENSE_PREFIX "libavcodec license: " |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
930 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1; |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
931 } |
|
046dcf7aa19c
Add functions to return library license and library configuration.
diego
parents:
10505
diff
changeset
|
932 |
| 0 | 933 void avcodec_init(void) |
| 934 { | |
| 6350 | 935 static int initialized = 0; |
|
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
936 |
| 6350 | 937 if (initialized != 0) |
| 2979 | 938 return; |
| 6350 | 939 initialized = 1; |
|
303
9a931fd8d06c
multiple init bugfix (patch by Alex Beregszaszi <alex@naxine.org>)
michaelni
parents:
267
diff
changeset
|
940 |
| 4197 | 941 dsputil_static_init(); |
| 0 | 942 } |
| 943 | |
| 341 | 944 void avcodec_flush_buffers(AVCodecContext *avctx) |
| 945 { | |
| 1368 | 946 if(avctx->codec->flush) |
| 947 avctx->codec->flush(avctx); | |
| 341 | 948 } |
| 949 | |
| 2231 | 950 void avcodec_default_free_buffers(AVCodecContext *s){ |
| 1214 | 951 int i, j; |
| 952 | |
| 953 if(s->internal_buffer==NULL) return; | |
| 2967 | 954 |
|
10398
11b685acd280
Print a warning message when avcodec_default_free_buffers finds unreleased
reimar
parents:
10386
diff
changeset
|
955 if (s->internal_buffer_count) |
|
11b685acd280
Print a warning message when avcodec_default_free_buffers finds unreleased
reimar
parents:
10386
diff
changeset
|
956 av_log(s, AV_LOG_WARNING, "Found %i unreleased buffers!\n", s->internal_buffer_count); |
| 1214 | 957 for(i=0; i<INTERNAL_BUFFER_SIZE; i++){ |
| 958 InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
| 959 for(j=0; j<4; j++){ | |
| 960 av_freep(&buf->base[j]); | |
| 961 buf->data[j]= NULL; | |
| 962 } | |
| 963 } | |
| 964 av_freep(&s->internal_buffer); | |
| 2967 | 965 |
| 1214 | 966 s->internal_buffer_count=0; |
| 967 } | |
| 968 | |
| 1264 | 969 char av_get_pict_type_char(int pict_type){ |
| 970 switch(pict_type){ | |
| 6450 | 971 case FF_I_TYPE: return 'I'; |
| 972 case FF_P_TYPE: return 'P'; | |
| 973 case FF_B_TYPE: return 'B'; | |
| 974 case FF_S_TYPE: return 'S'; | |
| 975 case FF_SI_TYPE:return 'i'; | |
| 976 case FF_SP_TYPE:return 'p'; | |
| 6456 | 977 case FF_BI_TYPE:return 'b'; |
| 6455 | 978 default: return '?'; |
| 1264 | 979 } |
| 980 } | |
| 981 | |
| 3433 | 982 int av_get_bits_per_sample(enum CodecID codec_id){ |
| 983 switch(codec_id){ | |
|
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
984 case CODEC_ID_ADPCM_SBPRO_2: |
| 3438 | 985 return 2; |
|
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
986 case CODEC_ID_ADPCM_SBPRO_3: |
| 3438 | 987 return 3; |
|
3435
ffa9e863f3be
simplify the voc demuxer using av_get_bits_per_sample()
aurel
parents:
3433
diff
changeset
|
988 case CODEC_ID_ADPCM_SBPRO_4: |
| 3438 | 989 case CODEC_ID_ADPCM_CT: |
| 10779 | 990 case CODEC_ID_ADPCM_IMA_WAV: |
|
10777
c4e157b47af5
Handle more ADPCM codecs in av_get_bits_per_sample().
daniel
parents:
10764
diff
changeset
|
991 case CODEC_ID_ADPCM_MS: |
|
c4e157b47af5
Handle more ADPCM codecs in av_get_bits_per_sample().
daniel
parents:
10764
diff
changeset
|
992 case CODEC_ID_ADPCM_YAMAHA: |
| 3438 | 993 return 4; |
| 3433 | 994 case CODEC_ID_PCM_ALAW: |
| 995 case CODEC_ID_PCM_MULAW: | |
| 996 case CODEC_ID_PCM_S8: | |
| 997 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
|
998 case CODEC_ID_PCM_ZORK: |
| 3433 | 999 return 8; |
| 1000 case CODEC_ID_PCM_S16BE: | |
| 1001 case CODEC_ID_PCM_S16LE: | |
|
5940
d63186919b60
add pcm_s16le_planar support for electronicarts files
aurel
parents:
5837
diff
changeset
|
1002 case CODEC_ID_PCM_S16LE_PLANAR: |
| 3433 | 1003 case CODEC_ID_PCM_U16BE: |
| 1004 case CODEC_ID_PCM_U16LE: | |
| 1005 return 16; | |
| 1006 case CODEC_ID_PCM_S24DAUD: | |
| 1007 case CODEC_ID_PCM_S24BE: | |
| 1008 case CODEC_ID_PCM_S24LE: | |
| 1009 case CODEC_ID_PCM_U24BE: | |
| 1010 case CODEC_ID_PCM_U24LE: | |
| 1011 return 24; | |
| 1012 case CODEC_ID_PCM_S32BE: | |
| 1013 case CODEC_ID_PCM_S32LE: | |
| 1014 case CODEC_ID_PCM_U32BE: | |
| 1015 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
|
1016 case CODEC_ID_PCM_F32BE: |
| 7613 | 1017 case CODEC_ID_PCM_F32LE: |
| 3433 | 1018 return 32; |
| 7613 | 1019 case CODEC_ID_PCM_F64BE: |
| 1020 case CODEC_ID_PCM_F64LE: | |
| 1021 return 64; | |
| 3433 | 1022 default: |
| 1023 return 0; | |
| 1024 } | |
| 1025 } | |
| 1026 | |
| 5537 | 1027 int av_get_bits_per_sample_format(enum SampleFormat sample_fmt) { |
| 1028 switch (sample_fmt) { | |
| 1029 case SAMPLE_FMT_U8: | |
| 1030 return 8; | |
| 1031 case SAMPLE_FMT_S16: | |
| 1032 return 16; | |
| 1033 case SAMPLE_FMT_S32: | |
| 1034 case SAMPLE_FMT_FLT: | |
| 1035 return 32; | |
| 7612 | 1036 case SAMPLE_FMT_DBL: |
| 1037 return 64; | |
| 5537 | 1038 default: |
| 1039 return 0; | |
| 1040 } | |
| 1041 } | |
| 1042 | |
| 8590 | 1043 #if !HAVE_THREADS |
|
2013
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1044 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
|
1045 s->thread_count = thread_count; |
|
2013
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1046 return -1; |
|
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1047 } |
|
85e547a18d87
dummy avcodec_thread_init() to avoid linking issues
michael
parents:
2002
diff
changeset
|
1048 #endif |
| 2676 | 1049 |
| 1050 unsigned int av_xiphlacing(unsigned char *s, unsigned int v) | |
| 1051 { | |
| 1052 unsigned int n = 0; | |
| 1053 | |
| 1054 while(v >= 0xff) { | |
| 1055 *s++ = 0xff; | |
| 1056 v -= 0xff; | |
| 1057 n++; | |
| 1058 } | |
| 1059 *s = v; | |
| 1060 n++; | |
| 1061 return n; | |
| 1062 } | |
|
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1063 |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1064 /* Wrapper to work around the lack of mkstemp() on mingw/cygin. |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1065 * Also, tries to create file in /tmp first, if possible. |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1066 * *prefix can be a character constant; *filename will be allocated internally. |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1067 * Returns file descriptor of opened file (or -1 on error) |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1068 * and opened file name in **filename. */ |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1069 int av_tempfile(char *prefix, char **filename) { |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1070 int fd=-1; |
| 8590 | 1071 #if !HAVE_MKSTEMP |
|
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1072 *filename = tempnam(".", prefix); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1073 #else |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1074 size_t len = strlen(prefix) + 12; /* room for "/tmp/" and "XXXXXX\0" */ |
| 3372 | 1075 *filename = av_malloc(len); |
|
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1076 #endif |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1077 /* -----common section-----*/ |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1078 if (*filename == NULL) { |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1079 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot allocate file name\n"); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1080 return -1; |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1081 } |
| 8590 | 1082 #if !HAVE_MKSTEMP |
| 5285 | 1083 fd = open(*filename, O_RDWR | O_BINARY | O_CREAT, 0444); |
|
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1084 #else |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1085 snprintf(*filename, len, "/tmp/%sXXXXXX", prefix); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1086 fd = mkstemp(*filename); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1087 if (fd < 0) { |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1088 snprintf(*filename, len, "./%sXXXXXX", prefix); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1089 fd = mkstemp(*filename); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1090 } |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1091 #endif |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1092 /* -----common section-----*/ |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1093 if (fd < 0) { |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1094 av_log(NULL, AV_LOG_ERROR, "ff_tempfile: Cannot open temporary file %s\n", *filename); |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1095 return -1; |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1096 } |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1097 return fd; /* success */ |
|
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3171
diff
changeset
|
1098 } |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1099 |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1100 typedef struct { |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1101 const char *abbr; |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1102 int width, height; |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1103 } VideoFrameSizeAbbr; |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1104 |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1105 typedef struct { |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1106 const char *abbr; |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1107 int rate_num, rate_den; |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1108 } VideoFrameRateAbbr; |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1109 |
| 7129 | 1110 static const VideoFrameSizeAbbr video_frame_size_abbrs[] = { |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1111 { "ntsc", 720, 480 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1112 { "pal", 720, 576 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1113 { "qntsc", 352, 240 }, /* VCD compliant NTSC */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1114 { "qpal", 352, 288 }, /* VCD compliant PAL */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1115 { "sntsc", 640, 480 }, /* square pixel NTSC */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1116 { "spal", 768, 576 }, /* square pixel PAL */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1117 { "film", 352, 240 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1118 { "ntsc-film", 352, 240 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1119 { "sqcif", 128, 96 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1120 { "qcif", 176, 144 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1121 { "cif", 352, 288 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1122 { "4cif", 704, 576 }, |
|
9328
6a1ad1d933cd
Add 16cif video frame size abbreviation. i.e. -s alias for 1408x1152.
gb
parents:
9193
diff
changeset
|
1123 { "16cif", 1408,1152 }, |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1124 { "qqvga", 160, 120 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1125 { "qvga", 320, 240 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1126 { "vga", 640, 480 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1127 { "svga", 800, 600 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1128 { "xga", 1024, 768 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1129 { "uxga", 1600,1200 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1130 { "qxga", 2048,1536 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1131 { "sxga", 1280,1024 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1132 { "qsxga", 2560,2048 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1133 { "hsxga", 5120,4096 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1134 { "wvga", 852, 480 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1135 { "wxga", 1366, 768 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1136 { "wsxga", 1600,1024 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1137 { "wuxga", 1920,1200 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1138 { "woxga", 2560,1600 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1139 { "wqsxga", 3200,2048 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1140 { "wquxga", 3840,2400 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1141 { "whsxga", 6400,4096 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1142 { "whuxga", 7680,4800 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1143 { "cga", 320, 200 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1144 { "ega", 640, 350 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1145 { "hd480", 852, 480 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1146 { "hd720", 1280, 720 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1147 { "hd1080", 1920,1080 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1148 }; |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1149 |
| 7129 | 1150 static const VideoFrameRateAbbr video_frame_rate_abbrs[]= { |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1151 { "ntsc", 30000, 1001 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1152 { "pal", 25, 1 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1153 { "qntsc", 30000, 1001 }, /* VCD compliant NTSC */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1154 { "qpal", 25, 1 }, /* VCD compliant PAL */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1155 { "sntsc", 30000, 1001 }, /* square pixel NTSC */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1156 { "spal", 25, 1 }, /* square pixel PAL */ |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1157 { "film", 24, 1 }, |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1158 { "ntsc-film", 24000, 1001 }, |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1159 }; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1160 |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1161 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
|
1162 { |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1163 int i; |
| 8042 | 1164 int n = FF_ARRAY_ELEMS(video_frame_size_abbrs); |
|
8757
d529e239a510
Remove 'const' qualifier from variable in av_parse_video_frame_size().
bcoudurier
parents:
8756
diff
changeset
|
1165 char *p; |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1166 int frame_width = 0, frame_height = 0; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1167 |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1168 for(i=0;i<n;i++) { |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1169 if (!strcmp(video_frame_size_abbrs[i].abbr, str)) { |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1170 frame_width = video_frame_size_abbrs[i].width; |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1171 frame_height = video_frame_size_abbrs[i].height; |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1172 break; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1173 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1174 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1175 if (i == n) { |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1176 p = str; |
|
8757
d529e239a510
Remove 'const' qualifier from variable in av_parse_video_frame_size().
bcoudurier
parents:
8756
diff
changeset
|
1177 frame_width = strtol(p, &p, 10); |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1178 if (*p) |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1179 p++; |
|
8757
d529e239a510
Remove 'const' qualifier from variable in av_parse_video_frame_size().
bcoudurier
parents:
8756
diff
changeset
|
1180 frame_height = strtol(p, &p, 10); |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1181 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1182 if (frame_width <= 0 || frame_height <= 0) |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1183 return -1; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1184 *width_ptr = frame_width; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1185 *height_ptr = frame_height; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1186 return 0; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1187 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1188 |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1189 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
|
1190 { |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1191 int i; |
| 8042 | 1192 int n = FF_ARRAY_ELEMS(video_frame_rate_abbrs); |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1193 char* cp; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1194 |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1195 /* First, we check our abbreviation table */ |
|
5176
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1196 for (i = 0; i < n; ++i) |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1197 if (!strcmp(video_frame_rate_abbrs[i].abbr, arg)) { |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1198 frame_rate->num = video_frame_rate_abbrs[i].rate_num; |
|
82f7eaa32f46
split frame rate and frame size abbreviation into two structures
benoit
parents:
5127
diff
changeset
|
1199 frame_rate->den = video_frame_rate_abbrs[i].rate_den; |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1200 return 0; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1201 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1202 |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1203 /* Then, we try to parse it as fraction */ |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1204 cp = strchr(arg, '/'); |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1205 if (!cp) |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1206 cp = strchr(arg, ':'); |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1207 if (cp) { |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1208 char* cpp; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1209 frame_rate->num = strtol(arg, &cpp, 10); |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1210 if (cpp != arg || cpp == cp) |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1211 frame_rate->den = strtol(cp+1, &cpp, 10); |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1212 else |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1213 frame_rate->num = 0; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1214 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1215 else { |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1216 /* Finally we give up and parse it as double */ |
| 7826 | 1217 AVRational time_base = av_d2q(strtod(arg, 0), 1001000); |
|
5126
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1218 frame_rate->den = time_base.den; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1219 frame_rate->num = time_base.num; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1220 } |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1221 if (!frame_rate->num || !frame_rate->den) |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1222 return -1; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1223 else |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1224 return 0; |
|
7982b376b58a
Move the video size and rate abbreviations system from libavformat to libavcodec
benoit
parents:
4986
diff
changeset
|
1225 } |
|
7530
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1226 |
|
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
|
1227 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
|
1228 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
|
1229 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
|
1230 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
|
1231 } |
|
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
|
1232 |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9787
diff
changeset
|
1233 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
|
1234 { |
|
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1235 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
|
1236 "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
|
1237 "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
|
1238 "been implemented.", feature); |
|
398636f16e7e
Add a generic function to lavc to log messages about missing features.
superdump
parents:
7475
diff
changeset
|
1239 if(want_sample) |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9787
diff
changeset
|
1240 av_log_ask_for_sample(avc, NULL); |
|
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1241 else |
|
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1242 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
|
1243 } |
|
8603
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1244 |
|
9891
7ad7d4094d1f
Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents:
9787
diff
changeset
|
1245 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
|
1246 { |
|
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1247 if (msg) |
|
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1248 av_log(avc, AV_LOG_WARNING, "%s ", msg); |
|
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1249 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
|
1250 "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
|
1251 "and contact the ffmpeg-devel mailing list.\n"); |
|
555c2ab21d84
Split ff_log_missing_feature into ff_log_missing_feature
benoit
parents:
8596
diff
changeset
|
1252 } |
| 9030 | 1253 |
| 1254 static AVHWAccel *first_hwaccel = NULL; | |
| 1255 | |
| 1256 void av_register_hwaccel(AVHWAccel *hwaccel) | |
| 1257 { | |
| 1258 AVHWAccel **p = &first_hwaccel; | |
| 1259 while (*p) | |
| 1260 p = &(*p)->next; | |
| 1261 *p = hwaccel; | |
| 1262 hwaccel->next = NULL; | |
| 1263 } | |
| 9031 | 1264 |
| 1265 AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel) | |
| 1266 { | |
| 1267 return hwaccel ? hwaccel->next : first_hwaccel; | |
| 1268 } | |
| 9032 | 1269 |
| 1270 AVHWAccel *ff_find_hwaccel(enum CodecID codec_id, enum PixelFormat pix_fmt) | |
| 1271 { | |
| 1272 AVHWAccel *hwaccel=NULL; | |
| 1273 | |
| 1274 while((hwaccel= av_hwaccel_next(hwaccel))){ | |
| 1275 if ( hwaccel->id == codec_id | |
| 1276 && hwaccel->pix_fmt == pix_fmt) | |
| 1277 return hwaccel; | |
| 1278 } | |
| 1279 return NULL; | |
| 1280 } | |
| 9742 | 1281 |
| 1282 int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)) | |
| 1283 { | |
| 1284 if (ff_lockmgr_cb) { | |
| 1285 if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY)) | |
| 1286 return -1; | |
| 1287 } | |
| 1288 | |
| 1289 ff_lockmgr_cb = cb; | |
| 1290 | |
| 1291 if (ff_lockmgr_cb) { | |
| 1292 if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_CREATE)) | |
| 1293 return -1; | |
| 1294 } | |
| 1295 return 0; | |
| 1296 } |
