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