mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 03:59:43 +00:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: build: fix standalone compilation of OMA muxer build: fix standalone compilation of Microsoft XMV demuxer build: fix standalone compilation of Core Audio Format demuxer kvmc: fix invalid reads 4xm: Add a check in decode_i_frame to prevent buffer overreads adpcm: fix IMA SMJPEG decoding options: set minimum for "threads" to zero bsd: use number of logical CPUs as automatic thread count windows: use number of CPUs as automatic thread count linux: use number of CPUs as automatic thread count pthreads: reset active_thread_type when slice thread_init returrns early v410dec: include correct headers Drop ALT_ prefix from BITSTREAM_READER_LE name. lavfi: always build vsrc_buffer. ra144enc: zero the reflection coeffs if the filter is unstable sws: readd PAL8 to isPacked() mov: Don't stick the QuickTime field ordering atom in extradata. truespeech: fix invalid reads in truespeech_apply_twopoint_filter() Conflicts: configure libavcodec/4xm.c libavcodec/avcodec.h libavfilter/Makefile libavfilter/allfilters.c libavformat/Makefile libswscale/swscale_internal.h Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
d1c28e3530
1
avconv.c
1
avconv.c
@ -2139,6 +2139,7 @@ static int transcode_init(OutputFile *output_files,
|
||||
codec->bit_rate = icodec->bit_rate;
|
||||
codec->rc_max_rate = icodec->rc_max_rate;
|
||||
codec->rc_buffer_size = icodec->rc_buffer_size;
|
||||
codec->field_order = icodec->field_order;
|
||||
codec->extradata = av_mallocz(extra_size);
|
||||
if (!codec->extradata) {
|
||||
return AVERROR(ENOMEM);
|
||||
|
9
configure
vendored
9
configure
vendored
@ -1174,6 +1174,7 @@ HAVE_LIST="
|
||||
gethrtime
|
||||
GetProcessMemoryInfo
|
||||
GetProcessTimes
|
||||
GetSystemInfo
|
||||
getrusage
|
||||
gnu_as
|
||||
ibm_asm
|
||||
@ -1206,6 +1207,7 @@ HAVE_LIST="
|
||||
posix_memalign
|
||||
round
|
||||
roundf
|
||||
sched_getaffinity
|
||||
sdl
|
||||
sdl_video_size
|
||||
setmode
|
||||
@ -1224,6 +1226,7 @@ HAVE_LIST="
|
||||
symver
|
||||
symver_asm_label
|
||||
symver_gnu_asm
|
||||
sysctl
|
||||
sys_mman_h
|
||||
sys_resource_h
|
||||
sys_select_h
|
||||
@ -1654,14 +1657,13 @@ postproc_deps="gpl"
|
||||
|
||||
# programs
|
||||
avconv_deps="avcodec avformat swscale"
|
||||
avconv_select="buffer_filter"
|
||||
ffplay_deps="avcodec avformat swscale sdl"
|
||||
ffplay_select="buffersink_filter rdft"
|
||||
ffprobe_deps="avcodec avformat"
|
||||
ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
|
||||
ffserver_extralibs='$ldl'
|
||||
ffmpeg_deps="avcodec avformat swscale swresample"
|
||||
ffmpeg_select="buffer_filter buffersink_filter"
|
||||
ffmpeg_select="buffersink_filter"
|
||||
|
||||
doc_deps="texi2html"
|
||||
|
||||
@ -3000,12 +3002,15 @@ check_func ${malloc_prefix}posix_memalign && enable posix_memalign
|
||||
check_func setrlimit
|
||||
check_func strerror_r
|
||||
check_func strptime
|
||||
check_func sched_getaffinity
|
||||
check_func sysctl
|
||||
check_func_headers conio.h kbhit
|
||||
check_func_headers windows.h PeekNamedPipe
|
||||
check_func_headers io.h setmode
|
||||
check_func_headers lzo/lzo1x.h lzo1x_999_compress
|
||||
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
|
||||
check_func_headers windows.h GetProcessTimes
|
||||
check_func_headers windows.h GetSystemInfo
|
||||
check_func_headers windows.h MapViewOfFile
|
||||
check_func_headers windows.h VirtualAlloc
|
||||
|
||||
|
1
ffmpeg.c
1
ffmpeg.c
@ -2213,6 +2213,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
|
||||
codec->bit_rate = icodec->bit_rate;
|
||||
codec->rc_max_rate = icodec->rc_max_rate;
|
||||
codec->rc_buffer_size = icodec->rc_buffer_size;
|
||||
codec->field_order = icodec->field_order;
|
||||
codec->extradata = av_mallocz(extra_size);
|
||||
if (!codec->extradata) {
|
||||
return AVERROR(ENOMEM);
|
||||
|
@ -688,10 +688,13 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){
|
||||
unsigned int prestream_size;
|
||||
const uint8_t *prestream;
|
||||
|
||||
if (bitstream_size > (1<<26) || length < bitstream_size + 12)
|
||||
return -1;
|
||||
prestream_size = 4*AV_RL32(buf + bitstream_size + 4);
|
||||
prestream = buf + bitstream_size + 12;
|
||||
if (bitstream_size > (1<<26) || length < bitstream_size + 12) {
|
||||
av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
|
||||
prestream = buf + bitstream_size + 12;
|
||||
|
||||
if (prestream_size > (1<<26) ||
|
||||
prestream_size != length - (bitstream_size + 12)){
|
||||
|
@ -1007,11 +1007,15 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
||||
break;
|
||||
case CODEC_ID_ADPCM_IMA_AMV:
|
||||
case CODEC_ID_ADPCM_IMA_SMJPEG:
|
||||
c->status[0].predictor = (int16_t)bytestream_get_le16(&src);
|
||||
c->status[0].step_index = bytestream_get_le16(&src);
|
||||
|
||||
if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV)
|
||||
src+=4;
|
||||
if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) {
|
||||
c->status[0].predictor = sign_extend(bytestream_get_le16(&src), 16);
|
||||
c->status[0].step_index = bytestream_get_le16(&src);
|
||||
src += 4;
|
||||
} else {
|
||||
c->status[0].predictor = sign_extend(bytestream_get_be16(&src), 16);
|
||||
c->status[0].step_index = bytestream_get_byte(&src);
|
||||
src += 1;
|
||||
}
|
||||
|
||||
for (n = nb_samples >> (1 - st); n > 0; n--, src++) {
|
||||
char hi, lo;
|
||||
|
@ -20,7 +20,7 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
#include "get_bits.h"
|
||||
|
@ -1335,6 +1335,15 @@ typedef struct AVFrame {
|
||||
|
||||
struct AVCodecInternal;
|
||||
|
||||
enum AVFieldOrder {
|
||||
AV_FIELD_UNKNOWN,
|
||||
AV_FIELD_PROGRESSIVE,
|
||||
AV_FIELD_TT, //< Top coded_first, top displayed first
|
||||
AV_FIELD_BB, //< Bottom coded first, bottom displayed first
|
||||
AV_FIELD_TB, //< Top coded first, bottom displayed first
|
||||
AV_FIELD_BT, //< Bottom coded first, top displayed first
|
||||
};
|
||||
|
||||
/**
|
||||
* main external API structure.
|
||||
* New fields can be added to the end with minor version bumps.
|
||||
@ -3191,6 +3200,12 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
struct AVCodecInternal *internal;
|
||||
|
||||
/** Field order
|
||||
* - encoding: set by libavcodec
|
||||
* - decoding: Set by libavcodec
|
||||
*/
|
||||
enum AVFieldOrder field_order;
|
||||
|
||||
/**
|
||||
* Current statistics for PTS correction.
|
||||
* - decoding: maintained and used by libavcodec, not intended to be used by user apps
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include "binkdsp.h"
|
||||
#include "mathops.h"
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
#define BINK_FLAG_ALPHA 0x00100000
|
||||
|
@ -29,7 +29,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "dsputil.h"
|
||||
#include "dct.h"
|
||||
|
@ -29,7 +29,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "bytestream.h"
|
||||
#include "dsputil.h"
|
||||
|
@ -29,7 +29,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "libavutil/lzo.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
typedef union MacroBlock {
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
#include "avcodec.h"
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
typedef struct Escape130Context {
|
||||
|
@ -26,7 +26,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "acelp_vectors.h"
|
||||
#include "celp_filters.h"
|
||||
|
@ -124,7 +124,7 @@ for examples see get_bits, show_bits, skip_bits, get_vlc
|
||||
|
||||
#define CLOSE_READER(name, gb) (gb)->index = name##_index
|
||||
|
||||
#ifdef ALT_BITSTREAM_READER_LE
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
|
||||
# ifdef LONG_BITSTREAM_READER
|
||||
# define UPDATE_CACHE(name, gb) name##_cache = \
|
||||
@ -164,7 +164,7 @@ for examples see get_bits, show_bits, skip_bits, get_vlc
|
||||
|
||||
#define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num)
|
||||
|
||||
#ifdef ALT_BITSTREAM_READER_LE
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
# define SHOW_UBITS(name, gb, num) zero_extend(name##_cache, num)
|
||||
# define SHOW_SBITS(name, gb, num) sign_extend(name##_cache, num)
|
||||
#else
|
||||
@ -254,7 +254,7 @@ static inline unsigned int get_bits1(GetBitContext *s)
|
||||
{
|
||||
unsigned int index = s->index;
|
||||
uint8_t result = s->buffer[index>>3];
|
||||
#ifdef ALT_BITSTREAM_READER_LE
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
result >>= index & 7;
|
||||
result &= 1;
|
||||
#else
|
||||
@ -288,7 +288,7 @@ static inline unsigned int get_bits_long(GetBitContext *s, int n)
|
||||
if (n <= MIN_CACHE_BITS)
|
||||
return get_bits(s, n);
|
||||
else {
|
||||
#ifdef ALT_BITSTREAM_READER_LE
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
int ret = get_bits(s, 16);
|
||||
return ret | (get_bits(s, n-16) << 16);
|
||||
#else
|
||||
|
@ -23,7 +23,7 @@
|
||||
* @file
|
||||
* Intel Indeo 2 decoder.
|
||||
*/
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "indeo2data.h"
|
||||
@ -163,7 +163,7 @@ static int ir2_decode_frame(AVCodecContext *avctx,
|
||||
s->decode_delta = buf[18];
|
||||
|
||||
/* decide whether frame uses deltas or not */
|
||||
#ifndef ALT_BITSTREAM_READER_LE
|
||||
#ifndef BITSTREAM_READER_LE
|
||||
for (i = 0; i < buf_size; i++)
|
||||
buf[i] = av_reverse[buf[i]];
|
||||
#endif
|
||||
@ -205,7 +205,7 @@ static av_cold int ir2_decode_init(AVCodecContext *avctx){
|
||||
|
||||
ir2_vlc.table = vlc_tables;
|
||||
ir2_vlc.table_allocated = 1 << CODE_VLC_BITS;
|
||||
#ifdef ALT_BITSTREAM_READER_LE
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
init_vlc(&ir2_vlc, CODE_VLC_BITS, IR2_CODES,
|
||||
&ir2_codes[0][1], 4, 2,
|
||||
&ir2_codes[0][0], 4, 2, INIT_VLC_USE_NEW_STATIC | INIT_VLC_LE);
|
||||
|
@ -26,7 +26,7 @@
|
||||
|
||||
#define IR2_CODES 143
|
||||
static const uint16_t ir2_codes[IR2_CODES][2] = {
|
||||
#ifdef ALT_BITSTREAM_READER_LE
|
||||
#ifdef BITSTREAM_READER_LE
|
||||
{0x0000, 3}, {0x0004, 3}, {0x0006, 3}, {0x0001, 5},
|
||||
{0x0009, 5}, {0x0019, 5}, {0x000D, 5}, {0x001D, 5},
|
||||
{0x0023, 6}, {0x0013, 6}, {0x0033, 6}, {0x000B, 6},
|
||||
|
@ -27,7 +27,7 @@
|
||||
* Known FOURCCs: 'IV50'
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "dsputil.h"
|
||||
|
@ -41,7 +41,7 @@
|
||||
#include "avcodec.h"
|
||||
#include "bytestream.h"
|
||||
#include "dsputil.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
#define PALETTE_COUNT 256
|
||||
|
@ -26,7 +26,7 @@
|
||||
* Indeo5 decoders.
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "ivi_common.h"
|
||||
|
@ -57,17 +57,21 @@ typedef struct BitBuf {
|
||||
|
||||
#define kmvc_init_getbits(bb, src) bb.bits = 7; bb.bitbuf = *src++;
|
||||
|
||||
#define kmvc_getbit(bb, src, res) {\
|
||||
#define kmvc_getbit(bb, src, src_end, res) {\
|
||||
res = 0; \
|
||||
if (bb.bitbuf & (1 << bb.bits)) res = 1; \
|
||||
bb.bits--; \
|
||||
if(bb.bits == -1) { \
|
||||
if (src >= src_end) { \
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); \
|
||||
return AVERROR_INVALIDDATA; \
|
||||
} \
|
||||
bb.bitbuf = *src++; \
|
||||
bb.bits = 7; \
|
||||
} \
|
||||
}
|
||||
|
||||
static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h)
|
||||
static int kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h)
|
||||
{
|
||||
BitBuf bb;
|
||||
int res, val;
|
||||
@ -75,13 +79,18 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
int bx, by;
|
||||
int l0x, l1x, l0y, l1y;
|
||||
int mx, my;
|
||||
const uint8_t *src_end = src + src_size;
|
||||
|
||||
kmvc_init_getbits(bb, src);
|
||||
|
||||
for (by = 0; by < h; by += 8)
|
||||
for (bx = 0; bx < w; bx += 8) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 8x8 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (i = 0; i < 64; i++)
|
||||
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val;
|
||||
@ -89,14 +98,22 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (i = 0; i < 4; i++) {
|
||||
l0x = bx + (i & 1) * 4;
|
||||
l0y = by + (i & 2) * 2;
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 4x4 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (j = 0; j < 16; j++)
|
||||
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val;
|
||||
} else { // copy block from already decoded place
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = val & 0xF;
|
||||
my = val >> 4;
|
||||
@ -108,16 +125,24 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (j = 0; j < 4; j++) {
|
||||
l1x = l0x + (j & 1) * 2;
|
||||
l1y = l0y + (j & 2);
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 2x2 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
BLK(ctx->cur, l1x, l1y) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y) = val;
|
||||
BLK(ctx->cur, l1x, l1y + 1) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y + 1) = val;
|
||||
} else { // copy block from already decoded place
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = val & 0xF;
|
||||
my = val >> 4;
|
||||
@ -140,9 +165,11 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h)
|
||||
static int kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h)
|
||||
{
|
||||
BitBuf bb;
|
||||
int res, val;
|
||||
@ -150,15 +177,20 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
int bx, by;
|
||||
int l0x, l1x, l0y, l1y;
|
||||
int mx, my;
|
||||
const uint8_t *src_end = src + src_size;
|
||||
|
||||
kmvc_init_getbits(bb, src);
|
||||
|
||||
for (by = 0; by < h; by += 8)
|
||||
for (bx = 0; bx < w; bx += 8) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 8x8 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (i = 0; i < 64; i++)
|
||||
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val;
|
||||
@ -171,14 +203,22 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (i = 0; i < 4; i++) {
|
||||
l0x = bx + (i & 1) * 4;
|
||||
l0y = by + (i & 2) * 2;
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 4x4 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (j = 0; j < 16; j++)
|
||||
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val;
|
||||
} else { // copy block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = (val & 0xF) - 8;
|
||||
my = (val >> 4) - 8;
|
||||
@ -190,16 +230,24 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (j = 0; j < 4; j++) {
|
||||
l1x = l0x + (j & 1) * 2;
|
||||
l1y = l0y + (j & 2);
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 2x2 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
BLK(ctx->cur, l1x, l1y) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y) = val;
|
||||
BLK(ctx->cur, l1x, l1y + 1) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y + 1) = val;
|
||||
} else { // copy block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = (val & 0xF) - 8;
|
||||
my = (val >> 4) - 8;
|
||||
@ -222,6 +270,8 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt)
|
||||
@ -299,10 +349,10 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPa
|
||||
memcpy(ctx->cur, ctx->prev, 320 * 200);
|
||||
break;
|
||||
case 3:
|
||||
kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height);
|
||||
kmvc_decode_intra_8x8(ctx, buf, buf_size, avctx->width, avctx->height);
|
||||
break;
|
||||
case 4:
|
||||
kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height);
|
||||
kmvc_decode_inter_8x8(ctx, buf, buf_size, avctx->width, avctx->height);
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "Unknown compression method %i\n", header & KMVC_METHOD);
|
||||
|
@ -112,12 +112,9 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
|
||||
build_basic_mjpeg_vlc(s);
|
||||
}
|
||||
}
|
||||
if (avctx->extradata_size > 9 &&
|
||||
AV_RL32(avctx->extradata + 4) == MKTAG('f','i','e','l')) {
|
||||
if (avctx->extradata[9] == 6) { /* quicktime icefloe 019 */
|
||||
s->interlace_polarity = 1; /* bottom field first */
|
||||
av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n");
|
||||
}
|
||||
if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
|
||||
s->interlace_polarity = 1; /* bottom field first */
|
||||
av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n");
|
||||
}
|
||||
if (avctx->codec->id == CODEC_ID_AMV)
|
||||
s->flipped = 1;
|
||||
|
@ -19,7 +19,7 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "msgsmdec.h"
|
||||
#include "gsmdec_template.c"
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
const float ff_nelly_dequantization_table[127] = {
|
||||
|
@ -41,7 +41,7 @@
|
||||
#include "fmtconvert.h"
|
||||
#include "sinewin.h"
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
|
||||
|
@ -371,7 +371,8 @@ static const AVOption options[]={
|
||||
{"float", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_AA_FLOAT }, INT_MIN, INT_MAX, V|D, "aa"},
|
||||
#endif
|
||||
{"qns", "quantizer noise shaping", OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 1 }, INT_MIN, INT_MAX, V|E|D},
|
||||
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 1 }, 0, INT_MAX, V|E|D, "threads"},
|
||||
{"auto", "detect a good number of threads", 0, AV_OPT_TYPE_CONST, {.dbl = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"},
|
||||
{"me_threshold", "motion estimaton threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"dc", "intra_dc_precision", OFFSET(intra_dc_precision), AV_OPT_TYPE_INT, {.dbl = 0 }, INT_MIN, INT_MAX, V|E},
|
||||
|
@ -30,6 +30,17 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if HAVE_SCHED_GETAFFINITY
|
||||
#define _GNU_SOURCE
|
||||
#include <sched.h>
|
||||
#elif HAVE_GETSYSTEMINFO
|
||||
#include <windows.h>
|
||||
#elif HAVE_SYSCTL
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "internal.h"
|
||||
#include "thread.h"
|
||||
@ -135,6 +146,40 @@ typedef struct FrameThreadContext {
|
||||
int die; ///< Set when threads should exit.
|
||||
} FrameThreadContext;
|
||||
|
||||
|
||||
/* H264 slice threading seems to be buggy with more than 16 threads,
|
||||
* limit the number of threads to 16 for automatic detection */
|
||||
#define MAX_AUTO_THREADS 16
|
||||
|
||||
static int get_logical_cpus(AVCodecContext *avctx)
|
||||
{
|
||||
int ret, nb_cpus = 1;
|
||||
#if HAVE_SCHED_GETAFFINITY
|
||||
cpu_set_t cpuset;
|
||||
|
||||
CPU_ZERO(&cpuset);
|
||||
|
||||
ret = sched_getaffinity(0, sizeof(cpuset), &cpuset);
|
||||
if (!ret) {
|
||||
nb_cpus = CPU_COUNT(&cpuset);
|
||||
}
|
||||
#elif HAVE_GETSYSTEMINFO
|
||||
SYSTEM_INFO sysinfo;
|
||||
GetSystemInfo(&sysinfo);
|
||||
nb_cpus = sysinfo.dwNumberOfProcessors;
|
||||
#elif HAVE_SYSCTL
|
||||
int mib[2] = { CTL_HW, HW_NCPU };
|
||||
size_t len = sizeof(nb_cpus);
|
||||
|
||||
ret = sysctl(mib, 2, &nb_cpus, &len, NULL, 0);
|
||||
if (ret == -1)
|
||||
nb_cpus = 0;
|
||||
#endif
|
||||
av_log(avctx, AV_LOG_DEBUG, "detected %d logical cores\n", nb_cpus);
|
||||
return FFMIN(nb_cpus, MAX_AUTO_THREADS);
|
||||
}
|
||||
|
||||
|
||||
static void* attribute_align_arg worker(void *v)
|
||||
{
|
||||
AVCodecContext *avctx = v;
|
||||
@ -239,8 +284,17 @@ static int thread_init(AVCodecContext *avctx)
|
||||
ThreadContext *c;
|
||||
int thread_count = avctx->thread_count;
|
||||
|
||||
if (thread_count <= 1)
|
||||
if (!thread_count) {
|
||||
int nb_cpus = get_logical_cpus(avctx);
|
||||
// use number of cores + 1 as thread count if there is motre than one
|
||||
if (nb_cpus > 1)
|
||||
thread_count = avctx->thread_count = nb_cpus + 1;
|
||||
}
|
||||
|
||||
if (thread_count <= 1) {
|
||||
avctx->active_thread_type = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
c = av_mallocz(sizeof(ThreadContext));
|
||||
if (!c)
|
||||
@ -704,6 +758,13 @@ static int frame_thread_init(AVCodecContext *avctx)
|
||||
FrameThreadContext *fctx;
|
||||
int i, err = 0;
|
||||
|
||||
if (!thread_count) {
|
||||
int nb_cpus = get_logical_cpus(avctx);
|
||||
// use number of cores + 1 as thread count if there is motre than one
|
||||
if (nb_cpus > 1)
|
||||
thread_count = avctx->thread_count = nb_cpus + 1;
|
||||
}
|
||||
|
||||
if (thread_count <= 1) {
|
||||
avctx->active_thread_type = 0;
|
||||
return 0;
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "dsputil.h"
|
||||
|
@ -477,7 +477,10 @@ static int ra144_encode_frame(AVCodecContext *avctx, uint8_t *frame,
|
||||
* The filter is unstable: use the coefficients of the previous frame.
|
||||
*/
|
||||
ff_int_to_int16(block_coefs[NBLOCKS - 1], ractx->lpc_coef[1]);
|
||||
ff_eval_refl(lpc_refl, block_coefs[NBLOCKS - 1], avctx);
|
||||
if (ff_eval_refl(lpc_refl, block_coefs[NBLOCKS - 1], avctx)) {
|
||||
/* the filter is still unstable. set reflection coeffs to zero. */
|
||||
memset(lpc_refl, 0, sizeof(lpc_refl));
|
||||
}
|
||||
}
|
||||
init_put_bits(&pb, frame, buf_size);
|
||||
for (i = 0; i < LPC_ORDER; i++) {
|
||||
|
@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "ra288.h"
|
||||
#include "lpc.h"
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
#include "libavutil/mathematics.h"
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "dsputil.h"
|
||||
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include "libavutil/audioconvert.h"
|
||||
#include "mathops.h"
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
#include "bytestream.h"
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
|
||||
|
||||
|
@ -179,6 +179,7 @@ static void truespeech_apply_twopoint_filter(TSContext *dec, int quart)
|
||||
for(i = 0; i < 146; i++)
|
||||
tmp[i] = dec->filtbuf[i];
|
||||
off = (t / 25) + dec->offset1[quart >> 1] + 18;
|
||||
off = av_clip(off, 0, 145);
|
||||
ptr0 = tmp + 145 - off;
|
||||
ptr1 = tmp + 146;
|
||||
filter = (const int16_t*)ts_order2_coeffs + (t % 25) * 2;
|
||||
|
@ -27,7 +27,7 @@
|
||||
* @author Alex Beregszaszi
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
//#define DEBUG
|
||||
#include <limits.h>
|
||||
#include "avcodec.h"
|
||||
|
@ -20,8 +20,8 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
|
||||
static av_cold int v410_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
|
@ -24,7 +24,7 @@
|
||||
* VBLE Decoder
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
|
@ -26,7 +26,7 @@
|
||||
* @author Denes Balatoni ( dbalatoni programozo hu )
|
||||
*/
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
#include <inttypes.h>
|
||||
#include <math.h>
|
||||
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "dsputil.h"
|
||||
|
@ -18,7 +18,7 @@
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "avcodec.h"
|
||||
#include "get_bits.h"
|
||||
#include "unary.h"
|
||||
|
@ -35,7 +35,7 @@
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "avcodec.h"
|
||||
#include "bytestream.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
// for av_memcpy_backptr
|
||||
#include "libavutil/lzo.h"
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include "avcodec.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "bytestream.h"
|
||||
#define ALT_BITSTREAM_READER_LE
|
||||
#define BITSTREAM_READER_LE
|
||||
#include "get_bits.h"
|
||||
// for av_memcpy_backptr
|
||||
#include "libavutil/lzo.h"
|
||||
|
@ -20,6 +20,7 @@ OBJS = allfilters.o \
|
||||
formats.o \
|
||||
graphparser.o \
|
||||
transform.o \
|
||||
vsrc_buffer.o
|
||||
|
||||
OBJS-$(CONFIG_AVCODEC) += avcodec.o
|
||||
|
||||
@ -83,7 +84,6 @@ OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o
|
||||
OBJS-$(CONFIG_VFLIP_FILTER) += vf_vflip.o
|
||||
OBJS-$(CONFIG_YADIF_FILTER) += vf_yadif.o
|
||||
|
||||
OBJS-$(CONFIG_BUFFER_FILTER) += vsrc_buffer.o
|
||||
OBJS-$(CONFIG_CELLAUTO_FILTER) += vsrc_cellauto.o
|
||||
OBJS-$(CONFIG_COLOR_FILTER) += vsrc_color.o
|
||||
OBJS-$(CONFIG_FREI0R_SRC_FILTER) += vf_frei0r.o
|
||||
|
@ -94,7 +94,6 @@ void avfilter_register_all(void)
|
||||
REGISTER_FILTER (VFLIP, vflip, vf);
|
||||
REGISTER_FILTER (YADIF, yadif, vf);
|
||||
|
||||
REGISTER_FILTER (BUFFER, buffer, vsrc);
|
||||
REGISTER_FILTER (CELLAUTO, cellauto, vsrc);
|
||||
REGISTER_FILTER (COLOR, color, vsrc);
|
||||
REGISTER_FILTER (FREI0R, frei0r_src, vsrc);
|
||||
@ -108,4 +107,10 @@ void avfilter_register_all(void)
|
||||
|
||||
REGISTER_FILTER (BUFFERSINK, buffersink, vsink);
|
||||
REGISTER_FILTER (NULLSINK, nullsink, vsink);
|
||||
|
||||
/* vsrc_buffer is a part of public API => registered unconditionally */
|
||||
{
|
||||
extern avfilter_vsrc_buffer;
|
||||
avfilter_register(&avfilter_vsrc_buffer);
|
||||
}
|
||||
}
|
||||
|
@ -56,7 +56,8 @@ OBJS-$(CONFIG_BIT_DEMUXER) += bit.o
|
||||
OBJS-$(CONFIG_BIT_MUXER) += bit.o
|
||||
OBJS-$(CONFIG_BMV_DEMUXER) += bmv.o
|
||||
OBJS-$(CONFIG_C93_DEMUXER) += c93.o vocdec.o voc.o
|
||||
OBJS-$(CONFIG_CAF_DEMUXER) += cafdec.o caf.o mov.o riff.o isom.o
|
||||
OBJS-$(CONFIG_CAF_DEMUXER) += cafdec.o caf.o mov.o mov_chan.o \
|
||||
riff.o isom.o
|
||||
OBJS-$(CONFIG_CAF_MUXER) += cafenc.o caf.o riff.o isom.o
|
||||
OBJS-$(CONFIG_CAVSVIDEO_DEMUXER) += cavsvideodec.o rawdec.o
|
||||
OBJS-$(CONFIG_CAVSVIDEO_MUXER) += rawenc.o
|
||||
@ -195,7 +196,7 @@ OBJS-$(CONFIG_OGG_DEMUXER) += oggdec.o \
|
||||
OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \
|
||||
vorbiscomment.o
|
||||
OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o
|
||||
OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o
|
||||
OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o id3v2enc.o
|
||||
OBJS-$(CONFIG_PCM_ALAW_DEMUXER) += pcmdec.o pcm.o rawdec.o
|
||||
OBJS-$(CONFIG_PCM_ALAW_MUXER) += pcmenc.o rawenc.o
|
||||
OBJS-$(CONFIG_PCM_F32BE_DEMUXER) += pcmdec.o pcm.o rawdec.o
|
||||
@ -331,7 +332,7 @@ OBJS-$(CONFIG_WTV_MUXER) += wtvenc.o wtv.o asf.o asfenc.o riff.o
|
||||
OBJS-$(CONFIG_WV_DEMUXER) += wv.o apetag.o
|
||||
OBJS-$(CONFIG_XA_DEMUXER) += xa.o
|
||||
OBJS-$(CONFIG_XBIN_DEMUXER) += bintext.o sauce.o
|
||||
OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o
|
||||
OBJS-$(CONFIG_XMV_DEMUXER) += xmv.o riff.o
|
||||
OBJS-$(CONFIG_XWMA_DEMUXER) += xwma.o riff.o
|
||||
OBJS-$(CONFIG_YOP_DEMUXER) += yop.o
|
||||
OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER) += yuv4mpeg.o
|
||||
|
@ -857,6 +857,40 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
AVStream *st;
|
||||
unsigned mov_field_order;
|
||||
enum AVFieldOrder decoded_field_order = AV_FIELD_UNKNOWN;
|
||||
|
||||
if (c->fc->nb_streams < 1) // will happen with jp2 files
|
||||
return 0;
|
||||
st = c->fc->streams[c->fc->nb_streams-1];
|
||||
if (atom.size < 2)
|
||||
return AVERROR_INVALIDDATA;
|
||||
mov_field_order = avio_rb16(pb);
|
||||
if ((mov_field_order & 0xFF00) == 0x0100)
|
||||
decoded_field_order = AV_FIELD_PROGRESSIVE;
|
||||
else if ((mov_field_order & 0xFF00) == 0x0200) {
|
||||
switch (mov_field_order & 0xFF) {
|
||||
case 0x01: decoded_field_order = AV_FIELD_TT;
|
||||
break;
|
||||
case 0x06: decoded_field_order = AV_FIELD_BB;
|
||||
break;
|
||||
case 0x09: decoded_field_order = AV_FIELD_TB;
|
||||
break;
|
||||
case 0x0E: decoded_field_order = AV_FIELD_BT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (decoded_field_order == AV_FIELD_UNKNOWN && mov_field_order) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Unknown MOV field order 0x%04x\n", mov_field_order);
|
||||
}
|
||||
st->codec->field_order = decoded_field_order;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */
|
||||
static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom,
|
||||
enum CodecID codec_id)
|
||||
@ -898,11 +932,6 @@ static int mov_read_avss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
return mov_read_extradata(c, pb, atom, CODEC_ID_AVS);
|
||||
}
|
||||
|
||||
static int mov_read_fiel(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
return mov_read_extradata(c, pb, atom, CODEC_ID_MJPEG);
|
||||
}
|
||||
|
||||
static int mov_read_jp2h(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
{
|
||||
return mov_read_extradata(c, pb, atom, CODEC_ID_JPEG2000);
|
||||
@ -950,6 +979,15 @@ static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if ((uint64_t)atom.size > (1<<30))
|
||||
return -1;
|
||||
|
||||
if (atom.size >= 10) {
|
||||
// Broken files created by legacy versions of Libav and FFmpeg will
|
||||
// wrap a whole fiel atom inside of a glbl atom.
|
||||
unsigned size = avio_rb32(pb);
|
||||
unsigned type = avio_rl32(pb);
|
||||
avio_seek(pb, -8, SEEK_CUR);
|
||||
if (type == MKTAG('f','i','e','l') && size == atom.size)
|
||||
return mov_read_default(c, pb, atom);
|
||||
}
|
||||
av_free(st->codec->extradata);
|
||||
st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!st->codec->extradata)
|
||||
|
@ -799,6 +799,23 @@ static int mov_write_uuid_tag_ipod(AVIOContext *pb)
|
||||
return 28;
|
||||
}
|
||||
|
||||
static const uint16_t fiel_data[] = {
|
||||
0x0000, 0x0100, 0x0201, 0x0206, 0x0209, 0x020e
|
||||
};
|
||||
|
||||
static int mov_write_fiel_tag(AVIOContext *pb, MOVTrack *track)
|
||||
{
|
||||
unsigned mov_field_order = 0;
|
||||
if (track->enc->field_order < FF_ARRAY_ELEMS(fiel_data))
|
||||
mov_field_order = fiel_data[track->enc->field_order];
|
||||
else
|
||||
return 0;
|
||||
avio_wb32(pb, 10);
|
||||
ffio_wfourcc(pb, "fiel");
|
||||
avio_wb16(pb, mov_field_order);
|
||||
return 10;
|
||||
}
|
||||
|
||||
static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track)
|
||||
{
|
||||
int64_t pos = avio_tell(pb);
|
||||
@ -885,7 +902,9 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
|
||||
mov_write_avcc_tag(pb, track);
|
||||
if(track->mode == MODE_IPOD)
|
||||
mov_write_uuid_tag_ipod(pb);
|
||||
} else if(track->vosLen > 0)
|
||||
} else if (track->enc->field_order != AV_FIELD_UNKNOWN)
|
||||
mov_write_fiel_tag(pb, track);
|
||||
else if(track->vosLen > 0)
|
||||
mov_write_glbl_tag(pb, track);
|
||||
|
||||
if (track->enc->sample_aspect_ratio.den && track->enc->sample_aspect_ratio.num &&
|
||||
|
@ -655,9 +655,11 @@ const char *sws_format_name(enum PixelFormat format);
|
||||
|| isBGRinInt(x) \
|
||||
)
|
||||
#else
|
||||
#define isPacked(x) \
|
||||
#define isPacked(x) (\
|
||||
(av_pix_fmt_descriptors[x].nb_components >= 2 && \
|
||||
!(av_pix_fmt_descriptors[x].flags & PIX_FMT_PLANAR))
|
||||
!(av_pix_fmt_descriptors[x].flags & PIX_FMT_PLANAR)) || \
|
||||
(x) == PIX_FMT_PAL8\
|
||||
)
|
||||
|
||||
#endif
|
||||
#define isPlanar(x) \
|
||||
|
Loading…
Reference in New Issue
Block a user