mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-10 16:59:59 +01:00
Compare commits
73 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1017b5914c | ||
|
|
9f47f95e70 | ||
|
|
9aa22918c2 | ||
|
|
9b89824f20 | ||
|
|
f479c17894 | ||
|
|
1203e92181 | ||
|
|
c693ccb89a | ||
|
|
7e34379897 | ||
|
|
ce795ac0f5 | ||
|
|
5ea2a8d43e | ||
|
|
3ada932202 | ||
|
|
adb784ad86 | ||
|
|
4de4eb60a1 | ||
|
|
a0866c7129 | ||
|
|
65830277d2 | ||
|
|
5ae7ed3aa4 | ||
|
|
61057f4604 | ||
|
|
d149c14a22 | ||
|
|
5bbee02ae0 | ||
|
|
f53a5332b0 | ||
|
|
e361fde8b0 | ||
|
|
1d7a453dcf | ||
|
|
481e55eba7 | ||
|
|
03457cabd6 | ||
|
|
0358a099f8 | ||
|
|
2656036757 | ||
|
|
f9f2591beb | ||
|
|
cbf51c4d36 | ||
|
|
26221a54ec | ||
|
|
7c214e313c | ||
|
|
7b337b1229 | ||
|
|
51ff11647f | ||
|
|
35f9a0896e | ||
|
|
cdc47c4813 | ||
|
|
e776a1e8f3 | ||
|
|
d6d2617d07 | ||
|
|
0e8ae6d10c | ||
|
|
24a8dfd37b | ||
|
|
a8f6d93071 | ||
|
|
ffa83bcc49 | ||
|
|
819541ff83 | ||
|
|
c5c7e3e6f7 | ||
|
|
5e7a5dd70b | ||
|
|
f194f2be41 | ||
|
|
343c87ac19 | ||
|
|
12479588d7 | ||
|
|
3e089e8f71 | ||
|
|
5dcc179924 | ||
|
|
848af79dec | ||
|
|
50ff83e3af | ||
|
|
2d7f139155 | ||
|
|
b589b8a704 | ||
|
|
5bd291e265 | ||
|
|
bdb975ab69 | ||
|
|
3f7d89034b | ||
|
|
b8eaf47917 | ||
|
|
718a2ddcb8 | ||
|
|
bd405475ce | ||
|
|
56eded8bc7 | ||
|
|
f401e60063 | ||
|
|
7f174cec8b | ||
|
|
a3f8c6a427 | ||
|
|
4c17e20ff0 | ||
|
|
6960372475 | ||
|
|
5bce35d958 | ||
|
|
8e72a8d1c2 | ||
|
|
a4b705b4cb | ||
|
|
802c4f5231 | ||
|
|
6636dd551f | ||
|
|
8ffdcd04c4 | ||
|
|
de32de679b | ||
|
|
311583e779 | ||
|
|
1a5a6ac01b |
4
configure
vendored
4
configure
vendored
@@ -2560,7 +2560,9 @@ probe_cc(){
|
||||
unset _depflags _DEPCMD _DEPFLAGS
|
||||
_flags_filter=echo
|
||||
|
||||
if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
|
||||
if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
|
||||
true # no-op to avoid reading stdin in following checks
|
||||
elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
|
||||
_type=llvm_gcc
|
||||
gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
|
||||
_ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
|
||||
|
||||
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 1.1.7
|
||||
PROJECT_NUMBER = 1.1.8
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify an logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
||||
@@ -1394,6 +1394,11 @@ static int read_frame_data(ALSDecContext *ctx, unsigned int ra_frame)
|
||||
|
||||
for (b = 0; b < ctx->num_blocks; b++) {
|
||||
bd.block_length = div_blocks[b];
|
||||
if (bd.block_length <= 0) {
|
||||
av_log(ctx->avctx, AV_LOG_WARNING,
|
||||
"Invalid block length %d in channel data!\n", bd.block_length);
|
||||
continue;
|
||||
}
|
||||
|
||||
for (c = 0; c < avctx->channels; c++) {
|
||||
bd.const_block = ctx->const_block + c;
|
||||
|
||||
@@ -41,10 +41,10 @@ function ff_scalarproduct_int16_neon, export=1
|
||||
|
||||
vpadd.s32 d16, d0, d1
|
||||
vpadd.s32 d17, d2, d3
|
||||
vpadd.s32 d10, d4, d5
|
||||
vpadd.s32 d11, d6, d7
|
||||
vpadd.s32 d18, d4, d5
|
||||
vpadd.s32 d19, d6, d7
|
||||
vpadd.s32 d0, d16, d17
|
||||
vpadd.s32 d1, d10, d11
|
||||
vpadd.s32 d1, d18, d19
|
||||
vpadd.s32 d2, d0, d1
|
||||
vpaddl.s32 d3, d2
|
||||
vmov.32 r0, d3[0]
|
||||
@@ -81,10 +81,10 @@ function ff_scalarproduct_and_madd_int16_neon, export=1
|
||||
|
||||
vpadd.s32 d16, d0, d1
|
||||
vpadd.s32 d17, d2, d3
|
||||
vpadd.s32 d10, d4, d5
|
||||
vpadd.s32 d11, d6, d7
|
||||
vpadd.s32 d18, d4, d5
|
||||
vpadd.s32 d19, d6, d7
|
||||
vpadd.s32 d0, d16, d17
|
||||
vpadd.s32 d1, d10, d11
|
||||
vpadd.s32 d1, d18, d19
|
||||
vpadd.s32 d2, d0, d1
|
||||
vpaddl.s32 d3, d2
|
||||
vmov.32 r0, d3[0]
|
||||
|
||||
@@ -305,7 +305,7 @@ STOP_TIMER("get_cabac_bypass")
|
||||
|
||||
for(i=0; i<SIZE; i++){
|
||||
START_TIMER
|
||||
if( (r[i]&1) != get_cabac(&c, state) )
|
||||
if( (r[i]&1) != get_cabac_noinline(&c, state) )
|
||||
av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
|
||||
STOP_TIMER("get_cabac")
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ static void cmv_decode_inter(CmvContext * s, const uint8_t *buf, const uint8_t *
|
||||
|
||||
static void cmv_process_header(CmvContext *s, const uint8_t *buf, const uint8_t *buf_end)
|
||||
{
|
||||
int pal_start, pal_count, i;
|
||||
int pal_start, pal_count, i, fps;
|
||||
|
||||
if(buf_end - buf < 16) {
|
||||
av_log(s->avctx, AV_LOG_WARNING, "truncated header\n");
|
||||
@@ -135,8 +135,9 @@ static void cmv_process_header(CmvContext *s, const uint8_t *buf, const uint8_t
|
||||
if (s->avctx->width!=s->width || s->avctx->height!=s->height)
|
||||
avcodec_set_dimensions(s->avctx, s->width, s->height);
|
||||
|
||||
s->avctx->time_base.num = 1;
|
||||
s->avctx->time_base.den = AV_RL16(&buf[10]);
|
||||
fps = AV_RL16(&buf[10]);
|
||||
if (fps > 0)
|
||||
s->avctx->time_base = (AVRational){ 1, fps };
|
||||
|
||||
pal_start = AV_RL16(&buf[12]);
|
||||
pal_count = AV_RL16(&buf[14]);
|
||||
|
||||
@@ -65,8 +65,8 @@ typedef struct GifState {
|
||||
int stored_img_size;
|
||||
int stored_bg_color;
|
||||
|
||||
GetByteContext gb;
|
||||
/* LZW compatible decoder */
|
||||
GetByteContext gb;
|
||||
LZWState *lzw;
|
||||
|
||||
/* aux buffers */
|
||||
@@ -144,11 +144,11 @@ static int gif_read_image(GifState *s)
|
||||
if (bytestream2_get_bytes_left(&s->gb) < 9)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
left = bytestream2_get_le16u(&s->gb);
|
||||
top = bytestream2_get_le16u(&s->gb);
|
||||
width = bytestream2_get_le16u(&s->gb);
|
||||
left = bytestream2_get_le16u(&s->gb);
|
||||
top = bytestream2_get_le16u(&s->gb);
|
||||
width = bytestream2_get_le16u(&s->gb);
|
||||
height = bytestream2_get_le16u(&s->gb);
|
||||
flags = bytestream2_get_byteu(&s->gb);
|
||||
flags = bytestream2_get_byteu(&s->gb);
|
||||
is_interleaved = flags & 0x40;
|
||||
has_local_palette = flags & 0x80;
|
||||
bits_per_pixel = (flags & 0x07) + 1;
|
||||
@@ -185,8 +185,11 @@ static int gif_read_image(GifState *s)
|
||||
|
||||
/* verify that all the image is inside the screen dimensions */
|
||||
if (left + width > s->screen_width ||
|
||||
top + height > s->screen_height)
|
||||
top + height > s->screen_height ||
|
||||
!width || !height) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid image dimensions.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* process disposal method */
|
||||
if (s->gce_prev_disposal == GCE_DISPOSAL_BACKGROUND) {
|
||||
@@ -314,7 +317,7 @@ static int gif_read_extension(GifState *s)
|
||||
if (bytestream2_get_bytes_left(&s->gb) < 5)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
gce_flags = bytestream2_get_byteu(&s->gb);
|
||||
gce_flags = bytestream2_get_byteu(&s->gb);
|
||||
bytestream2_skipu(&s->gb, 2); // delay during which the frame is shown
|
||||
gce_transparent_index = bytestream2_get_byteu(&s->gb);
|
||||
if (gce_flags & 0x01)
|
||||
@@ -368,7 +371,7 @@ static int gif_read_header1(GifState *s)
|
||||
|
||||
/* read screen header */
|
||||
s->transparent_color_index = -1;
|
||||
s->screen_width = bytestream2_get_le16u(&s->gb);
|
||||
s->screen_width = bytestream2_get_le16u(&s->gb);
|
||||
s->screen_height = bytestream2_get_le16u(&s->gb);
|
||||
if( (unsigned)s->screen_width > 32767
|
||||
|| (unsigned)s->screen_height > 32767){
|
||||
@@ -411,10 +414,10 @@ static int gif_read_header1(GifState *s)
|
||||
|
||||
static int gif_parse_next_image(GifState *s, int *got_picture)
|
||||
{
|
||||
int ret;
|
||||
*got_picture = 1;
|
||||
while (bytestream2_get_bytes_left(&s->gb)) {
|
||||
while (bytestream2_get_bytes_left(&s->gb) > 0) {
|
||||
int code = bytestream2_get_byte(&s->gb);
|
||||
int ret;
|
||||
|
||||
av_dlog(s->avctx, "code=%02x '%c'\n", code, code);
|
||||
|
||||
@@ -459,9 +462,9 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, A
|
||||
|
||||
bytestream2_init(&s->gb, avpkt->data, avpkt->size);
|
||||
|
||||
s->picture.pts = avpkt->pts;
|
||||
s->picture.pkt_pts = avpkt->pts;
|
||||
s->picture.pkt_dts = avpkt->dts;
|
||||
s->picture.pts = avpkt->pts;
|
||||
s->picture.pkt_pts = avpkt->pts;
|
||||
s->picture.pkt_dts = avpkt->dts;
|
||||
s->picture.pkt_duration = avpkt->duration;
|
||||
|
||||
if (avpkt->size >= 6) {
|
||||
@@ -513,7 +516,7 @@ static int gif_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, A
|
||||
else if (*got_frame)
|
||||
*picture = s->picture;
|
||||
|
||||
return avpkt->size;
|
||||
return bytestream2_tell(&s->gb);
|
||||
}
|
||||
|
||||
static av_cold int gif_decode_close(AVCodecContext *avctx)
|
||||
|
||||
@@ -67,9 +67,15 @@ static const uint8_t div6[QP_MAX_NUM + 1] = {
|
||||
};
|
||||
|
||||
static const enum AVPixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = {
|
||||
#if CONFIG_H264_DXVA2_HWACCEL
|
||||
AV_PIX_FMT_DXVA2_VLD,
|
||||
#endif
|
||||
#if CONFIG_H264_VAAPI_HWACCEL
|
||||
AV_PIX_FMT_VAAPI_VLD,
|
||||
#endif
|
||||
#if CONFIG_H264_VDA_HWACCEL
|
||||
AV_PIX_FMT_VDA_VLD,
|
||||
#endif
|
||||
AV_PIX_FMT_YUVJ420P,
|
||||
AV_PIX_FMT_NONE
|
||||
};
|
||||
@@ -2170,6 +2176,7 @@ static void flush_change(H264Context *h)
|
||||
h->sync= 0;
|
||||
h->list_count = 0;
|
||||
h->current_slice = 0;
|
||||
h->mmco_reset = 1;
|
||||
}
|
||||
|
||||
/* forget old pics after a seek */
|
||||
@@ -2920,7 +2927,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
||||
assert(s0->current_picture_ptr->f.reference != DELAYED_PIC_REF);
|
||||
|
||||
/* Mark old field/frame as completed */
|
||||
if (!last_pic_droppable && s0->current_picture_ptr->owner2 == s0) {
|
||||
if (s0->current_picture_ptr->owner2 == s0) {
|
||||
ff_thread_report_progress(&s0->current_picture_ptr->f, INT_MAX,
|
||||
last_pic_structure == PICT_BOTTOM_FIELD);
|
||||
}
|
||||
@@ -2929,7 +2936,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
||||
if (!FIELD_PICTURE || s->picture_structure == last_pic_structure) {
|
||||
/* Previous field is unmatched. Don't display it, but let it
|
||||
* remain for reference if marked as such. */
|
||||
if (!last_pic_droppable && last_pic_structure != PICT_FRAME) {
|
||||
if (last_pic_structure != PICT_FRAME) {
|
||||
ff_thread_report_progress(&s0->current_picture_ptr->f, INT_MAX,
|
||||
last_pic_structure == PICT_TOP_FIELD);
|
||||
}
|
||||
@@ -2939,7 +2946,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0)
|
||||
* different frame_nums. Consider this field first in
|
||||
* pair. Throw away previous field except for reference
|
||||
* purposes. */
|
||||
if (!last_pic_droppable && last_pic_structure != PICT_FRAME) {
|
||||
if (last_pic_structure != PICT_FRAME) {
|
||||
ff_thread_report_progress(&s0->current_picture_ptr->f, INT_MAX,
|
||||
last_pic_structure == PICT_TOP_FIELD);
|
||||
}
|
||||
|
||||
@@ -550,7 +550,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
|
||||
if(!pic){
|
||||
if(mmco[i].opcode != MMCO_SHORT2LONG || !h->long_ref[mmco[i].long_arg]
|
||||
|| h->long_ref[mmco[i].long_arg]->frame_num != frame_num) {
|
||||
av_log(h->s.avctx, AV_LOG_ERROR, "mmco: unref short failure\n");
|
||||
av_log(h->s.avctx, h->short_ref_count ? AV_LOG_ERROR : AV_LOG_DEBUG, "mmco: unref short failure\n");
|
||||
err = AVERROR_INVALIDDATA;
|
||||
}
|
||||
continue;
|
||||
@@ -687,7 +687,7 @@ int ff_h264_execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
|
||||
print_short_term(h);
|
||||
print_long_term(h);
|
||||
|
||||
if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=1 + (s->picture_structure != PICT_FRAME) && s->current_picture_ptr->f.pict_type == AV_PICTURE_TYPE_I){
|
||||
if(err >= 0 && h->long_ref_count==0 && h->short_ref_count<=2 && h->pps.ref_count[0]<=2 + (s->picture_structure != PICT_FRAME) && s->current_picture_ptr->f.pict_type == AV_PICTURE_TYPE_I){
|
||||
s->current_picture_ptr->sync |= 1;
|
||||
if(!h->s.avctx->has_b_frames)
|
||||
h->sync = 2;
|
||||
|
||||
@@ -296,6 +296,7 @@ static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band,
|
||||
|
||||
band->is_empty = get_bits1(&ctx->gb);
|
||||
if (!band->is_empty) {
|
||||
int old_blk_size = band->blk_size;
|
||||
/* skip header size
|
||||
* If header size is not given, header size is 4 bytes. */
|
||||
if (get_bits1(&ctx->gb))
|
||||
@@ -391,6 +392,17 @@ static int decode_band_hdr(IVI45DecContext *ctx, IVIBandDesc *band,
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
band->quant_mat = quant_mat;
|
||||
} else {
|
||||
if (old_blk_size != band->blk_size) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"The band block size does not match the configuration "
|
||||
"inherited\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (band->quant_mat < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid quant_mat inherited\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
}
|
||||
if (quant_index_to_tab[band->quant_mat] > 4 && band->blk_size == 4) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid quant matrix for 4x4 block encountered!\n");
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
*/
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "bytestream.h"
|
||||
#include "lzw.h"
|
||||
#include "libavutil/mem.h"
|
||||
|
||||
@@ -43,7 +44,7 @@ static const uint16_t mask[17] =
|
||||
};
|
||||
|
||||
struct LZWState {
|
||||
const uint8_t *pbuf, *ebuf;
|
||||
GetByteContext gb;
|
||||
int bbits;
|
||||
unsigned int bbuf;
|
||||
|
||||
@@ -73,9 +74,9 @@ static int lzw_get_code(struct LZWState * s)
|
||||
if(s->mode == FF_LZW_GIF) {
|
||||
while (s->bbits < s->cursize) {
|
||||
if (!s->bs) {
|
||||
s->bs = *s->pbuf++;
|
||||
s->bs = bytestream2_get_byte(&s->gb);
|
||||
}
|
||||
s->bbuf |= (*s->pbuf++) << s->bbits;
|
||||
s->bbuf |= bytestream2_get_byte(&s->gb) << s->bbits;
|
||||
s->bbits += 8;
|
||||
s->bs--;
|
||||
}
|
||||
@@ -83,7 +84,7 @@ static int lzw_get_code(struct LZWState * s)
|
||||
s->bbuf >>= s->cursize;
|
||||
} else { // TIFF
|
||||
while (s->bbits < s->cursize) {
|
||||
s->bbuf = (s->bbuf << 8) | (*s->pbuf++);
|
||||
s->bbuf = (s->bbuf << 8) | bytestream2_get_byte(&s->gb);
|
||||
s->bbits += 8;
|
||||
}
|
||||
c = s->bbuf >> (s->bbits - s->cursize);
|
||||
@@ -97,17 +98,12 @@ void ff_lzw_decode_tail(LZWState *p)
|
||||
struct LZWState *s = (struct LZWState *)p;
|
||||
|
||||
if(s->mode == FF_LZW_GIF) {
|
||||
while (s->bs > 0) {
|
||||
if (s->bs >= s->ebuf - s->pbuf) {
|
||||
s->pbuf = s->ebuf;
|
||||
break;
|
||||
} else {
|
||||
s->pbuf += s->bs;
|
||||
s->bs = *s->pbuf++;
|
||||
}
|
||||
while (s->bs > 0 && bytestream2_get_bytes_left(&s->gb)) {
|
||||
bytestream2_skip(&s->gb, s->bs);
|
||||
s->bs = bytestream2_get_byte(&s->gb);
|
||||
}
|
||||
}else
|
||||
s->pbuf= s->ebuf;
|
||||
bytestream2_skip(&s->gb, bytestream2_get_bytes_left(&s->gb));
|
||||
}
|
||||
|
||||
av_cold void ff_lzw_decode_open(LZWState **p)
|
||||
@@ -135,8 +131,7 @@ int ff_lzw_decode_init(LZWState *p, int csize, const uint8_t *buf, int buf_size,
|
||||
if(csize < 1 || csize >= LZW_MAXBITS)
|
||||
return -1;
|
||||
/* read buffer */
|
||||
s->pbuf = buf;
|
||||
s->ebuf = s->pbuf + buf_size;
|
||||
bytestream2_init(&s->gb, buf, buf_size);
|
||||
s->bbuf = 0;
|
||||
s->bbits = 0;
|
||||
s->bs = 0;
|
||||
@@ -186,10 +181,6 @@ int ff_lzw_decode(LZWState *p, uint8_t *buf, int len){
|
||||
if ((--l) == 0)
|
||||
goto the_end;
|
||||
}
|
||||
if (s->ebuf < s->pbuf) {
|
||||
av_log(NULL, AV_LOG_ERROR, "lzw overread\n");
|
||||
goto the_end;
|
||||
}
|
||||
c = lzw_get_code(s);
|
||||
if (c == s->end_code) {
|
||||
break;
|
||||
|
||||
@@ -165,6 +165,7 @@ static int mp_get_vlc(MotionPixelsContext *mp, GetBitContext *gb)
|
||||
int i;
|
||||
|
||||
i = (mp->codes_count == 1) ? 0 : get_vlc2(gb, mp->vlc.table, mp->max_codes_bits, 1);
|
||||
i = FFMIN(i, FF_ARRAY_ELEMS(mp->codes) - 1);
|
||||
return mp->codes[i].delta;
|
||||
}
|
||||
|
||||
|
||||
@@ -111,6 +111,7 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my);
|
||||
|
||||
extern uint8_t ff_mpeg4_static_rl_table_store[3][2][2*MAX_RUN + MAX_LEVEL + 3];
|
||||
|
||||
void ff_mpeg4_init_tables(void);
|
||||
|
||||
#if 0 //3IV1 is quite rare and it slows things down a tiny bit
|
||||
#define IS_3IV1 s->codec_tag == AV_RL32("3IV1")
|
||||
|
||||
@@ -48,6 +48,33 @@ static const int mb_type_b_map[4]= {
|
||||
MB_TYPE_L0 | MB_TYPE_16x16,
|
||||
};
|
||||
|
||||
av_cold void ff_mpeg4videodec_static_init(void)
|
||||
{
|
||||
static int done = 0;
|
||||
|
||||
if (!done) {
|
||||
ff_init_rl(&ff_mpeg4_rl_intra, ff_mpeg4_static_rl_table_store[0]);
|
||||
ff_init_rl(&ff_rvlc_rl_inter, ff_mpeg4_static_rl_table_store[1]);
|
||||
ff_init_rl(&ff_rvlc_rl_intra, ff_mpeg4_static_rl_table_store[2]);
|
||||
INIT_VLC_RL(ff_mpeg4_rl_intra, 554);
|
||||
INIT_VLC_RL(ff_rvlc_rl_inter, 1072);
|
||||
INIT_VLC_RL(ff_rvlc_rl_intra, 1072);
|
||||
INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
|
||||
&ff_mpeg4_DCtab_lum[0][1], 2, 1,
|
||||
&ff_mpeg4_DCtab_lum[0][0], 2, 1, 512);
|
||||
INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
|
||||
&ff_mpeg4_DCtab_chrom[0][1], 2, 1,
|
||||
&ff_mpeg4_DCtab_chrom[0][0], 2, 1, 512);
|
||||
INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
|
||||
&ff_sprite_trajectory_tab[0][1], 4, 2,
|
||||
&ff_sprite_trajectory_tab[0][0], 4, 2, 128);
|
||||
INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
|
||||
&ff_mb_type_b_tab[0][1], 2, 1,
|
||||
&ff_mb_type_b_tab[0][0], 2, 1, 16);
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Predict the ac.
|
||||
* @param n block index (0-3 are luma, 4-5 are chroma)
|
||||
@@ -2255,32 +2282,6 @@ end:
|
||||
return decode_vop_header(s, gb);
|
||||
}
|
||||
|
||||
av_cold void ff_mpeg4videodec_static_init(void) {
|
||||
static int done = 0;
|
||||
|
||||
if (!done) {
|
||||
ff_init_rl(&ff_mpeg4_rl_intra, ff_mpeg4_static_rl_table_store[0]);
|
||||
ff_init_rl(&ff_rvlc_rl_inter, ff_mpeg4_static_rl_table_store[1]);
|
||||
ff_init_rl(&ff_rvlc_rl_intra, ff_mpeg4_static_rl_table_store[2]);
|
||||
INIT_VLC_RL(ff_mpeg4_rl_intra, 554);
|
||||
INIT_VLC_RL(ff_rvlc_rl_inter, 1072);
|
||||
INIT_VLC_RL(ff_rvlc_rl_intra, 1072);
|
||||
INIT_VLC_STATIC(&dc_lum, DC_VLC_BITS, 10 /* 13 */,
|
||||
&ff_mpeg4_DCtab_lum[0][1], 2, 1,
|
||||
&ff_mpeg4_DCtab_lum[0][0], 2, 1, 512);
|
||||
INIT_VLC_STATIC(&dc_chrom, DC_VLC_BITS, 10 /* 13 */,
|
||||
&ff_mpeg4_DCtab_chrom[0][1], 2, 1,
|
||||
&ff_mpeg4_DCtab_chrom[0][0], 2, 1, 512);
|
||||
INIT_VLC_STATIC(&sprite_trajectory, SPRITE_TRAJ_VLC_BITS, 15,
|
||||
&ff_sprite_trajectory_tab[0][1], 4, 2,
|
||||
&ff_sprite_trajectory_tab[0][0], 4, 2, 128);
|
||||
INIT_VLC_STATIC(&mb_type_b_vlc, MB_TYPE_B_VLC_BITS, 4,
|
||||
&ff_mb_type_b_tab[0][1], 2, 1,
|
||||
&ff_mb_type_b_tab[0][0], 2, 1, 16);
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static av_cold int decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
MpegEncContext *s = avctx->priv_data;
|
||||
|
||||
@@ -128,9 +128,15 @@ const enum AVPixelFormat ff_pixfmt_list_420[] = {
|
||||
};
|
||||
|
||||
const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[] = {
|
||||
#if CONFIG_H264_DXVA2_HWACCEL
|
||||
AV_PIX_FMT_DXVA2_VLD,
|
||||
#endif
|
||||
#if CONFIG_H264_VAAPI_HWACCEL
|
||||
AV_PIX_FMT_VAAPI_VLD,
|
||||
#endif
|
||||
#if CONFIG_H264_VDA_HWACCEL
|
||||
AV_PIX_FMT_VDA_VLD,
|
||||
#endif
|
||||
AV_PIX_FMT_YUV420P,
|
||||
AV_PIX_FMT_NONE
|
||||
};
|
||||
|
||||
@@ -58,7 +58,7 @@ enum MSV1Mode{
|
||||
};
|
||||
|
||||
#define SKIP_PREFIX 0x8400
|
||||
#define SKIPS_MAX 0x0FFF
|
||||
#define SKIPS_MAX 0x03FF
|
||||
#define MKRGB555(in, off) ((in[off] << 10) | (in[off + 1] << 5) | (in[off + 2]))
|
||||
|
||||
static const int remap[16] = { 0, 1, 4, 5, 2, 3, 6, 7, 8, 9, 12, 13, 10, 11, 14, 15 };
|
||||
|
||||
@@ -368,7 +368,7 @@ static inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out,
|
||||
/**
|
||||
* Decode AC coefficients for all blocks in a slice.
|
||||
*/
|
||||
static inline void decode_ac_coeffs(GetBitContext *gb, DCTELEM *out,
|
||||
static inline int decode_ac_coeffs(GetBitContext *gb, DCTELEM *out,
|
||||
int blocks_per_slice,
|
||||
int plane_size_factor,
|
||||
const uint8_t *scan)
|
||||
@@ -389,15 +389,19 @@ static inline void decode_ac_coeffs(GetBitContext *gb, DCTELEM *out,
|
||||
|
||||
bits_left = get_bits_left(gb);
|
||||
if (bits_left <= 0 || (bits_left <= 8 && !show_bits(gb, bits_left)))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
run = decode_vlc_codeword(gb, ff_prores_ac_codebook[run_cb_index]);
|
||||
if (run < 0)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
bits_left = get_bits_left(gb);
|
||||
if (bits_left <= 0 || (bits_left <= 8 && !show_bits(gb, bits_left)))
|
||||
return;
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
level = decode_vlc_codeword(gb, ff_prores_ac_codebook[lev_cb_index]) + 1;
|
||||
if (level < 0)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
pos += run + 1;
|
||||
if (pos >= max_coeffs)
|
||||
@@ -407,22 +411,24 @@ static inline void decode_ac_coeffs(GetBitContext *gb, DCTELEM *out,
|
||||
out[((pos & block_mask) << 6) + scan[pos >> plane_size_factor]] =
|
||||
(level ^ sign) - sign;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Decode a slice plane (luma or chroma).
|
||||
*/
|
||||
static void decode_slice_plane(ProresContext *ctx, ProresThreadData *td,
|
||||
const uint8_t *buf,
|
||||
int data_size, uint16_t *out_ptr,
|
||||
int linesize, int mbs_per_slice,
|
||||
int blocks_per_mb, int plane_size_factor,
|
||||
const int16_t *qmat, int is_chroma)
|
||||
static int decode_slice_plane(ProresContext *ctx, ProresThreadData *td,
|
||||
const uint8_t *buf,
|
||||
int data_size, uint16_t *out_ptr,
|
||||
int linesize, int mbs_per_slice,
|
||||
int blocks_per_mb, int plane_size_factor,
|
||||
const int16_t *qmat, int is_chroma)
|
||||
{
|
||||
GetBitContext gb;
|
||||
DCTELEM *block_ptr;
|
||||
int mb_num, blocks_per_slice;
|
||||
int mb_num, blocks_per_slice, ret;
|
||||
|
||||
blocks_per_slice = mbs_per_slice * blocks_per_mb;
|
||||
|
||||
@@ -432,8 +438,10 @@ static void decode_slice_plane(ProresContext *ctx, ProresThreadData *td,
|
||||
|
||||
decode_dc_coeffs(&gb, td->blocks, blocks_per_slice);
|
||||
|
||||
decode_ac_coeffs(&gb, td->blocks, blocks_per_slice,
|
||||
plane_size_factor, ctx->scantable.permutated);
|
||||
ret = decode_ac_coeffs(&gb, td->blocks, blocks_per_slice,
|
||||
plane_size_factor, ctx->scantable.permutated);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* inverse quantization, inverse transform and output */
|
||||
block_ptr = td->blocks;
|
||||
@@ -467,6 +475,7 @@ static void decode_slice_plane(ProresContext *ctx, ProresThreadData *td,
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -485,6 +494,7 @@ static int decode_slice(AVCodecContext *avctx, void *tdata)
|
||||
int i, sf, slice_width_factor;
|
||||
int slice_data_size, hdr_size, y_data_size, u_data_size, v_data_size;
|
||||
int y_linesize, u_linesize, v_linesize;
|
||||
int ret;
|
||||
|
||||
buf = ctx->slice_data[slice_num].index;
|
||||
slice_data_size = ctx->slice_data[slice_num + 1].index - buf;
|
||||
@@ -541,28 +551,34 @@ static int decode_slice(AVCodecContext *avctx, void *tdata)
|
||||
}
|
||||
|
||||
/* decode luma plane */
|
||||
decode_slice_plane(ctx, td, buf + hdr_size, y_data_size,
|
||||
(uint16_t*) (y_data + (mb_y_pos << 4) * y_linesize +
|
||||
(mb_x_pos << 5)), y_linesize,
|
||||
mbs_per_slice, 4, slice_width_factor + 2,
|
||||
td->qmat_luma_scaled, 0);
|
||||
ret = decode_slice_plane(ctx, td, buf + hdr_size, y_data_size,
|
||||
(uint16_t*) (y_data + (mb_y_pos << 4) * y_linesize +
|
||||
(mb_x_pos << 5)), y_linesize,
|
||||
mbs_per_slice, 4, slice_width_factor + 2,
|
||||
td->qmat_luma_scaled, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* decode U chroma plane */
|
||||
decode_slice_plane(ctx, td, buf + hdr_size + y_data_size, u_data_size,
|
||||
(uint16_t*) (u_data + (mb_y_pos << 4) * u_linesize +
|
||||
(mb_x_pos << ctx->mb_chroma_factor)),
|
||||
u_linesize, mbs_per_slice, ctx->num_chroma_blocks,
|
||||
slice_width_factor + ctx->chroma_factor - 1,
|
||||
td->qmat_chroma_scaled, 1);
|
||||
ret = decode_slice_plane(ctx, td, buf + hdr_size + y_data_size, u_data_size,
|
||||
(uint16_t*) (u_data + (mb_y_pos << 4) * u_linesize +
|
||||
(mb_x_pos << ctx->mb_chroma_factor)),
|
||||
u_linesize, mbs_per_slice, ctx->num_chroma_blocks,
|
||||
slice_width_factor + ctx->chroma_factor - 1,
|
||||
td->qmat_chroma_scaled, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* decode V chroma plane */
|
||||
decode_slice_plane(ctx, td, buf + hdr_size + y_data_size + u_data_size,
|
||||
v_data_size,
|
||||
(uint16_t*) (v_data + (mb_y_pos << 4) * v_linesize +
|
||||
(mb_x_pos << ctx->mb_chroma_factor)),
|
||||
v_linesize, mbs_per_slice, ctx->num_chroma_blocks,
|
||||
slice_width_factor + ctx->chroma_factor - 1,
|
||||
td->qmat_chroma_scaled, 1);
|
||||
ret = decode_slice_plane(ctx, td, buf + hdr_size + y_data_size + u_data_size,
|
||||
v_data_size,
|
||||
(uint16_t*) (v_data + (mb_y_pos << 4) * v_linesize +
|
||||
(mb_x_pos << ctx->mb_chroma_factor)),
|
||||
v_linesize, mbs_per_slice, ctx->num_chroma_blocks,
|
||||
slice_width_factor + ctx->chroma_factor - 1,
|
||||
td->qmat_chroma_scaled, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -81,8 +81,8 @@ typedef struct ThreadContext {
|
||||
pthread_cond_t last_job_cond;
|
||||
pthread_cond_t current_job_cond;
|
||||
pthread_mutex_t current_job_lock;
|
||||
unsigned current_execute;
|
||||
int current_job;
|
||||
unsigned int current_execute;
|
||||
int done;
|
||||
} ThreadContext;
|
||||
|
||||
@@ -206,8 +206,8 @@ static void* attribute_align_arg worker(void *v)
|
||||
{
|
||||
AVCodecContext *avctx = v;
|
||||
ThreadContext *c = avctx->thread_opaque;
|
||||
unsigned last_execute = 0;
|
||||
int our_job = c->job_count;
|
||||
int last_execute = 0;
|
||||
int thread_count = avctx->thread_count;
|
||||
int self_id;
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
|
||||
{
|
||||
AVCodecContext *avctx = r->s.avctx;
|
||||
int mb_bits;
|
||||
int w = r->s.width, h = r->s.height;
|
||||
int mb_size;
|
||||
@@ -57,6 +58,13 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn
|
||||
rpr = 0;
|
||||
}
|
||||
if(rpr){
|
||||
if (avctx->extradata_size < rpr * 2 + 8) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Insufficient extradata - need at least %d bytes, got %d\n",
|
||||
8 + rpr * 2, avctx->extradata_size);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
w = r->s.avctx->extradata[6 + rpr*2] << 2;
|
||||
h = r->s.avctx->extradata[7 + rpr*2] << 2;
|
||||
}
|
||||
@@ -260,10 +268,7 @@ static av_cold int rv30_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
r->rpr = (avctx->extradata[1] & 7) >> 1;
|
||||
r->rpr = FFMIN(r->rpr + 1, 3);
|
||||
if(avctx->extradata_size - 8 < (r->rpr - 1) * 2){
|
||||
av_log(avctx, AV_LOG_ERROR, "Insufficient extradata - need at least %d bytes, got %d\n",
|
||||
6 + r->rpr * 2, avctx->extradata_size);
|
||||
}
|
||||
|
||||
r->parse_slice_header = rv30_parse_slice_header;
|
||||
r->decode_intra_types = rv30_decode_intra_types;
|
||||
r->decode_mb_info = rv30_decode_mb_info;
|
||||
|
||||
@@ -273,7 +273,8 @@ static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const int fixed_coeffs[3][3] = {
|
||||
static const int fixed_coeffs[][3] = {
|
||||
{ 0, 0, 0 },
|
||||
{ 1, 0, 0 },
|
||||
{ 2, -1, 0 },
|
||||
{ 3, -3, 1 }
|
||||
@@ -302,7 +303,12 @@ static int decode_subframe_lpc(ShortenContext *s, int command, int channel,
|
||||
} else {
|
||||
/* fixed LPC coeffs */
|
||||
pred_order = command;
|
||||
coeffs = fixed_coeffs[pred_order - 1];
|
||||
if (pred_order >= FF_ARRAY_ELEMS(fixed_coeffs)) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "invalid pred_order %d\n",
|
||||
pred_order);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
coeffs = fixed_coeffs[pred_order];
|
||||
qshift = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -513,6 +513,15 @@ hres,vres,i,i%vres (0 < i < 4)
|
||||
index = s->index_stream[index_stream_index++] * 4; \
|
||||
}
|
||||
|
||||
#define INC_INDEX \
|
||||
do { \
|
||||
if (index >= 1023) { \
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid index value.\n"); \
|
||||
return; \
|
||||
} \
|
||||
index++; \
|
||||
} while (0)
|
||||
|
||||
#define APPLY_C_PREDICTOR() \
|
||||
if(index > 1023){\
|
||||
av_log(s->avctx, AV_LOG_ERROR, " index %d went out of bounds\n", index); \
|
||||
@@ -529,10 +538,10 @@ hres,vres,i,i%vres (0 < i < 4)
|
||||
if (predictor_pair & 1) \
|
||||
GET_NEXT_INDEX() \
|
||||
else \
|
||||
index++; \
|
||||
INC_INDEX; \
|
||||
} \
|
||||
} else \
|
||||
index++;
|
||||
INC_INDEX;
|
||||
|
||||
#define APPLY_C_PREDICTOR_24() \
|
||||
if(index > 1023){\
|
||||
@@ -550,10 +559,10 @@ hres,vres,i,i%vres (0 < i < 4)
|
||||
if (predictor_pair & 1) \
|
||||
GET_NEXT_INDEX() \
|
||||
else \
|
||||
index++; \
|
||||
INC_INDEX; \
|
||||
} \
|
||||
} else \
|
||||
index++;
|
||||
INC_INDEX;
|
||||
|
||||
|
||||
#define APPLY_Y_PREDICTOR() \
|
||||
@@ -572,10 +581,10 @@ hres,vres,i,i%vres (0 < i < 4)
|
||||
if (predictor_pair & 1) \
|
||||
GET_NEXT_INDEX() \
|
||||
else \
|
||||
index++; \
|
||||
INC_INDEX; \
|
||||
} \
|
||||
} else \
|
||||
index++;
|
||||
INC_INDEX;
|
||||
|
||||
#define APPLY_Y_PREDICTOR_24() \
|
||||
if(index > 1023){\
|
||||
@@ -593,10 +602,10 @@ hres,vres,i,i%vres (0 < i < 4)
|
||||
if (predictor_pair & 1) \
|
||||
GET_NEXT_INDEX() \
|
||||
else \
|
||||
index++; \
|
||||
INC_INDEX; \
|
||||
} \
|
||||
} else \
|
||||
index++;
|
||||
INC_INDEX;
|
||||
|
||||
#define OUTPUT_PIXEL_PAIR() \
|
||||
*current_pixel_pair = *vert_pred + horiz_pred; \
|
||||
|
||||
@@ -1011,6 +1011,8 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
||||
v->reffield = get_bits1(gb);
|
||||
v->ref_field_type[0] = v->reffield ^ !v->cur_field_type;
|
||||
}
|
||||
} else {
|
||||
v->numref = 0;
|
||||
}
|
||||
if (v->extended_mv)
|
||||
v->mvrange = get_unary(gb, 0, 3);
|
||||
|
||||
@@ -382,42 +382,6 @@ cglobal ac3_compute_mantissa_size, 1, 2, 4, mant_cnt, sum
|
||||
%endif
|
||||
%endmacro
|
||||
|
||||
%if HAVE_AMD3DNOW_EXTERNAL
|
||||
INIT_MMX 3dnow
|
||||
cglobal ac3_extract_exponents, 3, 3, 0, exp, coef, len
|
||||
add expq, lenq
|
||||
lea coefq, [coefq+4*lenq]
|
||||
neg lenq
|
||||
movq m3, [pd_1]
|
||||
movq m4, [pd_151]
|
||||
.loop:
|
||||
movq m0, [coefq+4*lenq ]
|
||||
movq m1, [coefq+4*lenq+8]
|
||||
PABSD m0, m2
|
||||
PABSD m1, m2
|
||||
pslld m0, 1
|
||||
por m0, m3
|
||||
pi2fd m2, m0
|
||||
psrld m2, 23
|
||||
movq m0, m4
|
||||
psubd m0, m2
|
||||
pslld m1, 1
|
||||
por m1, m3
|
||||
pi2fd m2, m1
|
||||
psrld m2, 23
|
||||
movq m1, m4
|
||||
psubd m1, m2
|
||||
packssdw m0, m0
|
||||
packuswb m0, m0
|
||||
packssdw m1, m1
|
||||
packuswb m1, m1
|
||||
punpcklwd m0, m1
|
||||
movd [expq+lenq], m0
|
||||
add lenq, 4
|
||||
jl .loop
|
||||
REP_RET
|
||||
%endif
|
||||
|
||||
%macro AC3_EXTRACT_EXPONENTS 0
|
||||
cglobal ac3_extract_exponents, 3, 3, 4, exp, coef, len
|
||||
add expq, lenq
|
||||
|
||||
@@ -194,7 +194,6 @@ av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact)
|
||||
c->ac3_rshift_int32 = ff_ac3_rshift_int32_mmx;
|
||||
}
|
||||
if (EXTERNAL_AMD3DNOW(mm_flags)) {
|
||||
c->extract_exponents = ff_ac3_extract_exponents_3dnow;
|
||||
if (!bit_exact) {
|
||||
c->float_to_fixed24 = ff_float_to_fixed24_3dnow;
|
||||
}
|
||||
|
||||
@@ -117,9 +117,9 @@ void ff_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
|
||||
(*links)[idx] = NULL;
|
||||
|
||||
(*count)++;
|
||||
for (i = idx+1; i < *count; i++)
|
||||
if (*links[i])
|
||||
(*(unsigned *)((uint8_t *) *links[i] + padidx_off))++;
|
||||
for (i = idx + 1; i < *count; i++)
|
||||
if ((*links)[i])
|
||||
(*(unsigned *)((uint8_t *) (*links)[i] + padidx_off))++;
|
||||
}
|
||||
|
||||
int avfilter_link(AVFilterContext *src, unsigned srcpad,
|
||||
|
||||
@@ -490,7 +490,8 @@ static int avi_read_header(AVFormatContext *s)
|
||||
avi->dv_demux = avpriv_dv_init_demux(s);
|
||||
if (!avi->dv_demux)
|
||||
goto fail;
|
||||
}
|
||||
} else
|
||||
goto fail;
|
||||
s->streams[0]->priv_data = ast;
|
||||
avio_skip(pb, 3 * 4);
|
||||
ast->scale = avio_rl32(pb);
|
||||
@@ -636,6 +637,8 @@ static int avi_read_header(AVFormatContext *s)
|
||||
st->codec->codec_tag = tag1;
|
||||
st->codec->codec_id = ff_codec_get_id(ff_codec_bmp_tags, tag1);
|
||||
st->need_parsing = AVSTREAM_PARSE_HEADERS; // This is needed to get the pict type which is necessary for generating correct pts.
|
||||
if (st->codec->codec_tag == MKTAG('V', 'S', 'S', 'H'))
|
||||
st->need_parsing = AVSTREAM_PARSE_FULL;
|
||||
|
||||
if(st->codec->codec_tag==0 && st->codec->height > 0 && st->codec->extradata_size < 1U<<30){
|
||||
st->codec->extradata_size+= 9;
|
||||
@@ -1065,6 +1068,8 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
int size = avpriv_dv_get_packet(avi->dv_demux, pkt);
|
||||
if (size >= 0)
|
||||
return size;
|
||||
else
|
||||
goto resync;
|
||||
}
|
||||
|
||||
if(avi->non_interleaved){
|
||||
|
||||
@@ -1769,7 +1769,8 @@ static int matroska_read_header(AVFormatContext *s)
|
||||
av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
|
||||
1000000000, track->default_duration, 30000);
|
||||
#if FF_API_R_FRAME_RATE
|
||||
st->r_frame_rate = st->avg_frame_rate;
|
||||
if (st->avg_frame_rate.num < st->avg_frame_rate.den * 1000L)
|
||||
st->r_frame_rate = st->avg_frame_rate;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1684,6 +1684,8 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (!entries)
|
||||
{
|
||||
sc->keyframe_absent = 1;
|
||||
if (!st->need_parsing)
|
||||
st->need_parsing = AVSTREAM_PARSE_HEADERS;
|
||||
return 0;
|
||||
}
|
||||
if (entries >= UINT_MAX / sizeof(int))
|
||||
@@ -2522,7 +2524,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
if (!sc->ctts_count && sc->sample_count)
|
||||
{
|
||||
/* Complement ctts table if moov atom doesn't have ctts atom. */
|
||||
ctts_data = av_malloc(sizeof(*sc->ctts_data));
|
||||
ctts_data = av_realloc(NULL, sizeof(*sc->ctts_data));
|
||||
if (!ctts_data)
|
||||
return AVERROR(ENOMEM);
|
||||
sc->ctts_data = ctts_data;
|
||||
|
||||
@@ -283,6 +283,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
|
||||
AVStream *st = s->streams[0];
|
||||
int64_t ret = av_index_search_timestamp(st, timestamp, flags);
|
||||
int i, j;
|
||||
int dir = (flags&AVSEEK_FLAG_BACKWARD) ? -1 : 1;
|
||||
|
||||
if (mp3->is_cbr && st->duration > 0 && mp3->header_filesize > s->data_offset) {
|
||||
int64_t filesize = avio_size(s->pb);
|
||||
@@ -312,7 +313,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
|
||||
|
||||
#define MIN_VALID 3
|
||||
for(i=0; i<4096; i++) {
|
||||
int64_t pos = ie->pos + i;
|
||||
int64_t pos = ie->pos + i*dir;
|
||||
for(j=0; j<MIN_VALID; j++) {
|
||||
ret = check(s, pos);
|
||||
if(ret < 0)
|
||||
@@ -325,7 +326,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
|
||||
if(j!=MIN_VALID)
|
||||
i=0;
|
||||
|
||||
ret = avio_seek(s->pb, ie->pos + i, SEEK_SET);
|
||||
ret = avio_seek(s->pb, ie->pos + i*dir, SEEK_SET);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ff_update_cur_dts(s, st, ie->timestamp);
|
||||
|
||||
@@ -1849,6 +1849,8 @@ static int mxf_read_header(AVFormatContext *s)
|
||||
MXFContext *mxf = s->priv_data;
|
||||
KLVPacket klv;
|
||||
int64_t essence_offset = 0;
|
||||
int64_t last_pos = -1;
|
||||
uint64_t last_pos_index = 1;
|
||||
int ret;
|
||||
|
||||
mxf->last_forward_tell = INT64_MAX;
|
||||
@@ -1864,7 +1866,12 @@ static int mxf_read_header(AVFormatContext *s)
|
||||
|
||||
while (!url_feof(s->pb)) {
|
||||
const MXFMetadataReadTableEntry *metadata;
|
||||
|
||||
if (avio_tell(s->pb) == last_pos) {
|
||||
av_log(mxf->fc, AV_LOG_ERROR, "MXF structure loop detected\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if ((1ULL<<61) % last_pos_index++ == 0)
|
||||
last_pos = avio_tell(s->pb);
|
||||
if (klv_read_packet(&klv, s->pb) < 0) {
|
||||
/* EOF - seek to previous partition or stop */
|
||||
if(mxf_parse_handle_partition_or_eof(mxf) <= 0)
|
||||
|
||||
@@ -210,10 +210,16 @@ int ff_nut_sp_pts_cmp(const Syncpoint *a, const Syncpoint *b){
|
||||
return ((a->ts - b->ts) >> 32) - ((b->ts - a->ts) >> 32);
|
||||
}
|
||||
|
||||
void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){
|
||||
int ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){
|
||||
Syncpoint *sp= av_mallocz(sizeof(Syncpoint));
|
||||
struct AVTreeNode *node = av_tree_node_alloc();
|
||||
|
||||
if (!sp || !node) {
|
||||
av_freep(&sp);
|
||||
av_freep(&node);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
nut->sp_count++;
|
||||
|
||||
sp->pos= pos;
|
||||
@@ -224,6 +230,8 @@ void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts){
|
||||
av_free(sp);
|
||||
av_free(node);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int enu_free(void *opaque, void *elem)
|
||||
|
||||
@@ -123,7 +123,7 @@ void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val);
|
||||
int64_t ff_lsb2full(StreamContext *stream, int64_t lsb);
|
||||
int ff_nut_sp_pos_cmp(const Syncpoint *a, const Syncpoint *b);
|
||||
int ff_nut_sp_pts_cmp(const Syncpoint *a, const Syncpoint *b);
|
||||
void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts);
|
||||
int ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts);
|
||||
void ff_nut_free_sp(NUTContext *nut);
|
||||
|
||||
extern const Dispositions ff_nut_dispositions[];
|
||||
|
||||
@@ -546,6 +546,7 @@ static int decode_syncpoint(NUTContext *nut, int64_t *ts, int64_t *back_ptr)
|
||||
AVIOContext *bc = s->pb;
|
||||
int64_t end;
|
||||
uint64_t tmp;
|
||||
int ret;
|
||||
|
||||
nut->last_syncpoint_pos = avio_tell(bc) - 8;
|
||||
|
||||
@@ -567,7 +568,9 @@ static int decode_syncpoint(NUTContext *nut, int64_t *ts, int64_t *back_ptr)
|
||||
|
||||
*ts = tmp / nut->time_base_count *
|
||||
av_q2d(nut->time_base[tmp % nut->time_base_count]) * AV_TIME_BASE;
|
||||
ff_nut_add_sp(nut, nut->last_syncpoint_pos, *back_ptr, *ts);
|
||||
|
||||
if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, *back_ptr, *ts)) < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -584,8 +584,15 @@ static int write_index(NUTContext *nut, AVIOContext *bc) {
|
||||
int64_t last_pts= -1;
|
||||
int j, k;
|
||||
for (j=0; j<nut->sp_count; j++) {
|
||||
int flag = (nus->keyframe_pts[j] != AV_NOPTS_VALUE) ^ (j+1 == nut->sp_count);
|
||||
int flag;
|
||||
int n = 0;
|
||||
|
||||
if (j && nus->keyframe_pts[j] == nus->keyframe_pts[j-1]) {
|
||||
av_log(nut->avf, AV_LOG_WARNING, "Multiple keyframes with same PTS\n");
|
||||
nus->keyframe_pts[j] = AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
flag = (nus->keyframe_pts[j] != AV_NOPTS_VALUE) ^ (j+1 == nut->sp_count);
|
||||
for (; j<nut->sp_count && (nus->keyframe_pts[j] != AV_NOPTS_VALUE) == flag; j++)
|
||||
n++;
|
||||
|
||||
@@ -858,7 +865,8 @@ static int nut_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
ff_put_v(dyn_bc, sp ? (nut->last_syncpoint_pos - sp->pos) >> 4 : 0);
|
||||
put_packet(nut, bc, dyn_bc, 1, SYNCPOINT_STARTCODE);
|
||||
|
||||
ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0 /*unused*/, pkt->dts);
|
||||
if ((ret = ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0 /*unused*/, pkt->dts)) < 0)
|
||||
return ret;
|
||||
|
||||
if ((1ll<<60) % nut->sp_count == 0)
|
||||
for (i=0; i<s->nb_streams; i++) {
|
||||
|
||||
@@ -768,6 +768,11 @@ static int64_t ogg_read_timestamp(AVFormatContext *s, int stream_index,
|
||||
&& !ogg_packet(s, &i, &pstart, &psize, pos_arg)) {
|
||||
if (i == stream_index) {
|
||||
struct ogg_stream *os = ogg->streams + stream_index;
|
||||
// Dont trust the last timestamps of a ogm video
|
||||
if ( (os->flags & OGG_FLAG_EOS)
|
||||
&& !(os->flags & OGG_FLAG_BOS)
|
||||
&& os->codec == &ff_ogm_video_codec)
|
||||
continue;
|
||||
pts = ogg_calc_pts(s, i, NULL);
|
||||
ogg_validate_keyframe(s, i, pstart, psize);
|
||||
if (os->pflags & AV_PKT_FLAG_KEY) {
|
||||
|
||||
@@ -233,9 +233,8 @@ static int decrypt_init(AVFormatContext *s, ID3v2ExtraMeta *em, uint8_t *header)
|
||||
av_log(s, AV_LOG_ERROR, "Invalid encryption header\n");
|
||||
return -1;
|
||||
}
|
||||
if ( OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size + oc->i_size + 8 > geob->datasize
|
||||
|| OMA_ENC_HEADER_SIZE + 48 > geob->datasize
|
||||
) {
|
||||
if (OMA_ENC_HEADER_SIZE + oc->k_size + oc->e_size + oc->i_size + 8 > geob->datasize ||
|
||||
OMA_ENC_HEADER_SIZE + 48 > geob->datasize) {
|
||||
av_log(s, AV_LOG_ERROR, "Too little GEOB data\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
@@ -125,9 +125,10 @@ static int pmp_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
int num_packets;
|
||||
pmp->audio_packets = avio_r8(pb);
|
||||
if (!pmp->audio_packets) {
|
||||
av_log_ask_for_sample(s, "0 audio packets\n");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
av_log(s, AV_LOG_ERROR, "No audio packets.\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
num_packets = (pmp->num_streams - 1) * pmp->audio_packets + 1;
|
||||
avio_skip(pb, 8);
|
||||
pmp->current_packet = 0;
|
||||
|
||||
@@ -402,7 +402,7 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
|
||||
switch (c->codec_id) {
|
||||
case AV_CODEC_ID_H264: {
|
||||
int mode = 1;
|
||||
if (fmt && fmt->oformat->priv_class &&
|
||||
if (fmt && fmt->oformat && fmt->oformat->priv_class &&
|
||||
av_opt_flag_is_set(fmt->priv_data, "rtpflags", "h264_mode0"))
|
||||
mode = 0;
|
||||
if (c->extradata_size) {
|
||||
|
||||
@@ -1163,12 +1163,14 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
|
||||
if (pkt->dts != AV_NOPTS_VALUE) {
|
||||
// got DTS from the stream, update reference timestamp
|
||||
st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
|
||||
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
||||
} else if (st->reference_dts != AV_NOPTS_VALUE) {
|
||||
// compute DTS based on reference timestamp
|
||||
pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
|
||||
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
||||
}
|
||||
|
||||
if (st->reference_dts != AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE)
|
||||
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
||||
|
||||
if (pc->dts_sync_point > 0)
|
||||
st->reference_dts = pkt->dts; // new reference
|
||||
}
|
||||
@@ -2817,9 +2819,10 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
goto find_stream_info_err;
|
||||
}
|
||||
|
||||
read_size += pkt->size;
|
||||
|
||||
st = ic->streams[pkt->stream_index];
|
||||
if (!(st->disposition & AV_DISPOSITION_ATTACHED_PIC))
|
||||
read_size += pkt->size;
|
||||
|
||||
if (pkt->dts != AV_NOPTS_VALUE && st->codec_info_nb_frames > 1) {
|
||||
/* check for non-increasing dts */
|
||||
if (st->info->fps_last_dts != AV_NOPTS_VALUE &&
|
||||
|
||||
@@ -374,8 +374,15 @@ break_loop:
|
||||
|
||||
avio_seek(pb, data_ofs, SEEK_SET);
|
||||
|
||||
if (!sample_count && st->codec->channels && av_get_bits_per_sample(st->codec->codec_id) && wav->data_end <= avio_size(pb))
|
||||
sample_count = (data_size<<3) / (st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id));
|
||||
if (!sample_count || av_get_exact_bits_per_sample(st->codec->codec_id) > 0)
|
||||
if ( st->codec->channels
|
||||
&& data_size
|
||||
&& av_get_bits_per_sample(st->codec->codec_id)
|
||||
&& wav->data_end <= avio_size(pb))
|
||||
sample_count = (data_size << 3)
|
||||
/
|
||||
(st->codec->channels * (uint64_t)av_get_bits_per_sample(st->codec->codec_id));
|
||||
|
||||
if (sample_count)
|
||||
st->duration = sample_count;
|
||||
|
||||
|
||||
@@ -195,23 +195,23 @@ static void mix_1_to_2_fltp_flt_c(float **samples, float **matrix, int len,
|
||||
|
||||
while (len > 4) {
|
||||
v = *src++;
|
||||
*dst0++ = v * m1;
|
||||
*dst1++ = v * m0;
|
||||
*dst0++ = v * m0;
|
||||
*dst1++ = v * m1;
|
||||
v = *src++;
|
||||
*dst0++ = v * m1;
|
||||
*dst1++ = v * m0;
|
||||
*dst0++ = v * m0;
|
||||
*dst1++ = v * m1;
|
||||
v = *src++;
|
||||
*dst0++ = v * m1;
|
||||
*dst1++ = v * m0;
|
||||
*dst0++ = v * m0;
|
||||
*dst1++ = v * m1;
|
||||
v = *src++;
|
||||
*dst0++ = v * m1;
|
||||
*dst1++ = v * m0;
|
||||
*dst0++ = v * m0;
|
||||
*dst1++ = v * m1;
|
||||
len -= 4;
|
||||
}
|
||||
while (len > 0) {
|
||||
v = *src++;
|
||||
*dst0++ = v * m1;
|
||||
*dst1++ = v * m0;
|
||||
*dst0++ = v * m0;
|
||||
*dst1++ = v * m1;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -350,7 +350,8 @@ int attribute_align_arg avresample_convert(AVAudioResampleContext *avr,
|
||||
resample_out = &output_buffer;
|
||||
else
|
||||
resample_out = avr->resample_out_buffer;
|
||||
av_dlog(avr, "[resample] %s to %s\n", current_buffer->name,
|
||||
av_dlog(avr, "[resample] %s to %s\n",
|
||||
current_buffer ? current_buffer->name : "null",
|
||||
resample_out->name);
|
||||
ret = ff_audio_resample(avr->resample, resample_out,
|
||||
current_buffer);
|
||||
|
||||
@@ -52,14 +52,12 @@ fate-ac3-encode: CMD = enc_dec_pcm ac3 wav s16le $(REF) -c:a ac3 -b:a 128k
|
||||
fate-ac3-encode: CMP_SHIFT = -1024
|
||||
fate-ac3-encode: CMP_TARGET = 399.62
|
||||
fate-ac3-encode: SIZE_TOLERANCE = 488
|
||||
fate-ac3-encode: FUZZ = 4
|
||||
|
||||
FATE_EAC3-$(call ENCDEC, EAC3, EAC3) += fate-eac3-encode
|
||||
fate-eac3-encode: CMD = enc_dec_pcm eac3 wav s16le $(REF) -c:a eac3 -b:a 128k
|
||||
fate-eac3-encode: CMP_SHIFT = -1024
|
||||
fate-eac3-encode: CMP_TARGET = 514.02
|
||||
fate-eac3-encode: SIZE_TOLERANCE = 488
|
||||
fate-eac3-encode: FUZZ = 3
|
||||
|
||||
fate-ac3-encode fate-eac3-encode: CMP = stddev
|
||||
fate-ac3-encode fate-eac3-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav
|
||||
|
||||
Reference in New Issue
Block a user