Commit 3ba0bfe7 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  ulti: Fix invalid reads
  lavf: dealloc private options in av_write_trailer
  yadif: support 10bit YUV
  vc1: mark with ER_MB_ERROR bits overconsumption
  lavc: introduce ER_MB_END and ER_MB_ERROR
  error_resilience: use the ER_ namespace
  build: move inclusion of subdir.mak to main subdir loop
  rv34: NEON optimised 4x4 dequant
  rv34: move 4x4 dequant to RV34DSPContext
  aacdec: Use intfloat.h rather than local punning union.

Conflicts:
	libavcodec/h264.c
	libavcodec/vc1dec.c
	libavfilter/vf_yadif.c
	libavformat/Makefile
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 36be045e a99273eb
...@@ -77,6 +77,7 @@ define DOSUBDIR ...@@ -77,6 +77,7 @@ define DOSUBDIR
$(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V)))) $(foreach V,$(SUBDIR_VARS),$(eval $(call RESET,$(V))))
SUBDIR := $(1)/ SUBDIR := $(1)/
include $(SRC_PATH)/$(1)/Makefile include $(SRC_PATH)/$(1)/Makefile
include $(SRC_PATH)/subdir.mak
endef endef
$(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D)))) $(foreach D,$(FFLIBS),$(eval $(call DOSUBDIR,lib$(D))))
......
...@@ -732,8 +732,6 @@ DIRS = alpha arm bfin mlib ppc ps2 sh4 sparc x86 ...@@ -732,8 +732,6 @@ DIRS = alpha arm bfin mlib ppc ps2 sh4 sparc x86
CLEANFILES = *_tables.c *_tables.h *_tablegen$(HOSTEXESUF) CLEANFILES = *_tables.c *_tables.h *_tablegen$(HOSTEXESUF)
include $(SRC_PATH)/subdir.mak
$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o $(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o
TRIG_TABLES = cos cos_fixed sin TRIG_TABLES = cos cos_fixed sin
......
...@@ -98,6 +98,7 @@ ...@@ -98,6 +98,7 @@
#include "aacsbr.h" #include "aacsbr.h"
#include "mpeg4audio.h" #include "mpeg4audio.h"
#include "aacadtsdec.h" #include "aacadtsdec.h"
#include "libavutil/intfloat.h"
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
...@@ -108,11 +109,6 @@ ...@@ -108,11 +109,6 @@
# include "arm/aac.h" # include "arm/aac.h"
#endif #endif
union float754 {
float f;
uint32_t i;
};
static VLC vlc_scalefactors; static VLC vlc_scalefactors;
static VLC vlc_spectral[11]; static VLC vlc_spectral[11];
...@@ -1023,7 +1019,7 @@ static inline float *VMUL4(float *dst, const float *v, unsigned idx, ...@@ -1023,7 +1019,7 @@ static inline float *VMUL4(float *dst, const float *v, unsigned idx,
static inline float *VMUL2S(float *dst, const float *v, unsigned idx, static inline float *VMUL2S(float *dst, const float *v, unsigned idx,
unsigned sign, const float *scale) unsigned sign, const float *scale)
{ {
union float754 s0, s1; union av_intfloat32 s0, s1;
s0.f = s1.f = *scale; s0.f = s1.f = *scale;
s0.i ^= sign >> 1 << 31; s0.i ^= sign >> 1 << 31;
...@@ -1041,8 +1037,8 @@ static inline float *VMUL4S(float *dst, const float *v, unsigned idx, ...@@ -1041,8 +1037,8 @@ static inline float *VMUL4S(float *dst, const float *v, unsigned idx,
unsigned sign, const float *scale) unsigned sign, const float *scale)
{ {
unsigned nz = idx >> 12; unsigned nz = idx >> 12;
union float754 s = { .f = *scale }; union av_intfloat32 s = { .f = *scale };
union float754 t; union av_intfloat32 t;
t.i = s.i ^ (sign & 1U<<31); t.i = s.i ^ (sign & 1U<<31);
*dst++ = v[idx & 3] * t.f; *dst++ = v[idx & 3] * t.f;
...@@ -1291,7 +1287,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024], ...@@ -1291,7 +1287,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
static av_always_inline float flt16_round(float pf) static av_always_inline float flt16_round(float pf)
{ {
union float754 tmp; union av_intfloat32 tmp;
tmp.f = pf; tmp.f = pf;
tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U; tmp.i = (tmp.i + 0x00008000U) & 0xFFFF0000U;
return tmp.f; return tmp.f;
...@@ -1299,7 +1295,7 @@ static av_always_inline float flt16_round(float pf) ...@@ -1299,7 +1295,7 @@ static av_always_inline float flt16_round(float pf)
static av_always_inline float flt16_even(float pf) static av_always_inline float flt16_even(float pf)
{ {
union float754 tmp; union av_intfloat32 tmp;
tmp.f = pf; tmp.f = pf;
tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U; tmp.i = (tmp.i + 0x00007FFFU + (tmp.i & 0x00010000U >> 16)) & 0xFFFF0000U;
return tmp.f; return tmp.f;
...@@ -1307,7 +1303,7 @@ static av_always_inline float flt16_even(float pf) ...@@ -1307,7 +1303,7 @@ static av_always_inline float flt16_even(float pf)
static av_always_inline float flt16_trunc(float pf) static av_always_inline float flt16_trunc(float pf)
{ {
union float754 pun; union av_intfloat32 pun;
pun.f = pf; pun.f = pf;
pun.i &= 0xFFFF0000U; pun.i &= 0xFFFF0000U;
return pun.f; return pun.f;
......
...@@ -25,9 +25,12 @@ ...@@ -25,9 +25,12 @@
void ff_rv34_inv_transform_neon(DCTELEM *block); void ff_rv34_inv_transform_neon(DCTELEM *block);
void ff_rv34_inv_transform_noround_neon(DCTELEM *block); void ff_rv34_inv_transform_noround_neon(DCTELEM *block);
void ff_rv34_dequant4x4_neon(DCTELEM *block, int Qdc, int Q);
void ff_rv34dsp_init_neon(RV34DSPContext *c, DSPContext* dsp) void ff_rv34dsp_init_neon(RV34DSPContext *c, DSPContext* dsp)
{ {
c->rv34_inv_transform_tab[0] = ff_rv34_inv_transform_neon; c->rv34_inv_transform_tab[0] = ff_rv34_inv_transform_neon;
c->rv34_inv_transform_tab[1] = ff_rv34_inv_transform_noround_neon; c->rv34_inv_transform_tab[1] = ff_rv34_inv_transform_noround_neon;
c->rv34_dequant4x4 = ff_rv34_dequant4x4_neon;
} }
...@@ -107,3 +107,27 @@ function ff_rv34_inv_transform_noround_neon, export=1 ...@@ -107,3 +107,27 @@ function ff_rv34_inv_transform_noround_neon, export=1
vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r2,:64], r1 vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r2,:64], r1
bx lr bx lr
endfunc endfunc
function ff_rv34_dequant4x4_neon, export=1
mov r3, r0
mov r12, #16
vdup.16 q0, r2
vmov.16 d0[0], r1
vld1.16 {d2}, [r0,:64], r12
vld1.16 {d4}, [r0,:64], r12
vld1.16 {d6}, [r0,:64], r12
vld1.16 {d16}, [r0,:64], r12
vmull.s16 q1, d2, d0
vmull.s16 q2, d4, d1
vmull.s16 q3, d6, d1
vmull.s16 q8, d16, d1
vqrshrn.s32 d2, q1, #4
vqrshrn.s32 d4, q2, #4
vqrshrn.s32 d6, q3, #4
vqrshrn.s32 d16, q8, #4
vst1.16 {d2}, [r3,:64], r12
vst1.16 {d4}, [r3,:64], r12
vst1.16 {d6}, [r3,:64], r12
vst1.16 {d16}, [r3,:64], r12
bx lr
endfunc
This diff is collapsed.
...@@ -148,7 +148,7 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){ ...@@ -148,7 +148,7 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size){
} }
static int decode_slice(MpegEncContext *s){ static int decode_slice(MpegEncContext *s){
const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F; const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F;
const int mb_size= 16>>s->avctx->lowres; const int mb_size= 16>>s->avctx->lowres;
s->last_resync_gb= s->gb; s->last_resync_gb= s->gb;
s->first_slice_line= 1; s->first_slice_line= 1;
...@@ -184,7 +184,7 @@ static int decode_slice(MpegEncContext *s){ ...@@ -184,7 +184,7 @@ static int decode_slice(MpegEncContext *s){
/* per-row end of slice checks */ /* per-row end of slice checks */
if(s->msmpeg4_version){ if(s->msmpeg4_version){
if(s->resync_mb_y + s->slice_height == s->mb_y){ if(s->resync_mb_y + s->slice_height == s->mb_y){
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
return 0; return 0;
} }
...@@ -225,7 +225,7 @@ static int decode_slice(MpegEncContext *s){ ...@@ -225,7 +225,7 @@ static int decode_slice(MpegEncContext *s){
ff_h263_loop_filter(s); ff_h263_loop_filter(s);
//printf("%d %d %d %06X\n", s->mb_x, s->mb_y, s->gb.size*8 - get_bits_count(&s->gb), show_bits(&s->gb, 24)); //printf("%d %d %d %06X\n", s->mb_x, s->mb_y, s->gb.size*8 - get_bits_count(&s->gb), show_bits(&s->gb, 24));
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask);
s->padding_bug_score--; s->padding_bug_score--;
...@@ -238,11 +238,11 @@ static int decode_slice(MpegEncContext *s){ ...@@ -238,11 +238,11 @@ static int decode_slice(MpegEncContext *s){
return 0; return 0;
}else if(ret==SLICE_NOEND){ }else if(ret==SLICE_NOEND){
av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy); av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, ER_MB_END&part_mask);
return -1; return -1;
} }
av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy); av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask);
return -1; return -1;
} }
...@@ -321,7 +321,7 @@ static int decode_slice(MpegEncContext *s){ ...@@ -321,7 +321,7 @@ static int decode_slice(MpegEncContext *s){
else if(left<0){ else if(left<0){
av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left); av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
}else }else
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
return 0; return 0;
} }
...@@ -330,7 +330,7 @@ static int decode_slice(MpegEncContext *s){ ...@@ -330,7 +330,7 @@ static int decode_slice(MpegEncContext *s){
get_bits_left(&s->gb), get_bits_left(&s->gb),
show_bits(&s->gb, 24), s->padding_bug_score); show_bits(&s->gb, 24), s->padding_bug_score);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask);
return -1; return -1;
} }
...@@ -673,7 +673,7 @@ retry: ...@@ -673,7 +673,7 @@ retry:
if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type==AV_PICTURE_TYPE_I) if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type==AV_PICTURE_TYPE_I)
if(!CONFIG_MSMPEG4_DECODER || msmpeg4_decode_ext_header(s, buf_size) < 0){ if(!CONFIG_MSMPEG4_DECODER || msmpeg4_decode_ext_header(s, buf_size) < 0){
s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR; s->error_status_table[s->mb_num-1]= ER_MB_ERROR;
} }
assert(s->bitstream_buffer_size==0); assert(s->bitstream_buffer_size==0);
......
...@@ -3593,7 +3593,7 @@ static void decode_finish_row(H264Context *h){ ...@@ -3593,7 +3593,7 @@ static void decode_finish_row(H264Context *h){
static int decode_slice(struct AVCodecContext *avctx, void *arg){ static int decode_slice(struct AVCodecContext *avctx, void *arg){
H264Context *h = *(void**)arg; H264Context *h = *(void**)arg;
MpegEncContext * const s = &h->s; MpegEncContext * const s = &h->s;
const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F; const int part_mask= s->partitioned_frame ? (ER_AC_END|ER_AC_ERROR) : 0x7F;
int lf_x_start = s->mb_x; int lf_x_start = s->mb_x;
s->mb_skip_run= -1; s->mb_skip_run= -1;
...@@ -3632,13 +3632,13 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){ ...@@ -3632,13 +3632,13 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
eos = get_cabac_terminate( &h->cabac ); eos = get_cabac_terminate( &h->cabac );
if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){ if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END&part_mask);
if (s->mb_x >= lf_x_start) loop_filter(h, lf_x_start, s->mb_x + 1); if (s->mb_x >= lf_x_start) loop_filter(h, lf_x_start, s->mb_x + 1);
return 0; return 0;
} }
if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", s->mb_x, s->mb_y, h->cabac.bytestream_end - h->cabac.bytestream); av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", s->mb_x, s->mb_y, h->cabac.bytestream_end - h->cabac.bytestream);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask);
return -1; return -1;
} }
...@@ -3656,7 +3656,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){ ...@@ -3656,7 +3656,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
if( eos || s->mb_y >= s->mb_height ) { if( eos || s->mb_y >= s->mb_height ) {
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits); tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END&part_mask);
if (s->mb_x > lf_x_start) loop_filter(h, lf_x_start, s->mb_x); if (s->mb_x > lf_x_start) loop_filter(h, lf_x_start, s->mb_x);
return 0; return 0;
} }
...@@ -3678,7 +3678,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){ ...@@ -3678,7 +3678,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
if(ret<0){ if(ret<0){
av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask);
return -1; return -1;
} }
...@@ -3697,11 +3697,11 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){ ...@@ -3697,11 +3697,11 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
if( get_bits_count(&s->gb) == s->gb.size_in_bits if( get_bits_count(&s->gb) == s->gb.size_in_bits
|| get_bits_count(&s->gb) < s->gb.size_in_bits && s->avctx->error_recognition < FF_ER_AGGRESSIVE) { || get_bits_count(&s->gb) < s->gb.size_in_bits && s->avctx->error_recognition < FF_ER_AGGRESSIVE) {
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END&part_mask);
return 0; return 0;
}else{ }else{
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_END&part_mask);
return -1; return -1;
} }
...@@ -3711,12 +3711,12 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){ ...@@ -3711,12 +3711,12 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg){
if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){ if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits); tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
if(get_bits_count(&s->gb) == s->gb.size_in_bits ){ if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END&part_mask);
if (s->mb_x > lf_x_start) loop_filter(h, lf_x_start, s->mb_x); if (s->mb_x > lf_x_start) loop_filter(h, lf_x_start, s->mb_x);
return 0; return 0;
}else{ }else{
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR&part_mask);
return -1; return -1;
} }
......
...@@ -690,13 +690,13 @@ av_cold void ff_h264_decode_init_vlc(void); ...@@ -690,13 +690,13 @@ av_cold void ff_h264_decode_init_vlc(void);
/** /**
* Decode a macroblock * Decode a macroblock
* @return 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
*/ */
int ff_h264_decode_mb_cavlc(H264Context *h); int ff_h264_decode_mb_cavlc(H264Context *h);
/** /**
* Decode a CABAC coded macroblock * Decode a CABAC coded macroblock
* @return 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
*/ */
int ff_h264_decode_mb_cabac(H264Context *h); int ff_h264_decode_mb_cabac(H264Context *h);
......
...@@ -1864,7 +1864,7 @@ static av_always_inline void decode_cabac_luma_residual( H264Context *h, const u ...@@ -1864,7 +1864,7 @@ static av_always_inline void decode_cabac_luma_residual( H264Context *h, const u
/** /**
* Decode a macroblock. * Decode a macroblock.
* @return 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed * @return 0 if OK, ER_AC_ERROR / ER_DC_ERROR / ER_MV_ERROR if an error is noticed
*/ */
int ff_h264_decode_mb_cabac(H264Context *h) { int ff_h264_decode_mb_cabac(H264Context *h) {
MpegEncContext * const s = &h->s; MpegEncContext * const s = &h->s;
......
...@@ -784,6 +784,6 @@ int ff_intrax8_decode_picture(IntraX8Context * const w, int dquant, int quant_of ...@@ -784,6 +784,6 @@ int ff_intrax8_decode_picture(IntraX8Context * const w, int dquant, int quant_of
error: error:
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y,
(s->mb_x>>1)-1, (s->mb_y>>1)-1, (s->mb_x>>1)-1, (s->mb_y>>1)-1,
(AC_END|DC_END|MV_END) ); ER_MB_END );
return 0; return 0;
} }
...@@ -1900,9 +1900,9 @@ static int slice_decode_thread(AVCodecContext *c, void *arg) ...@@ -1900,9 +1900,9 @@ static int slice_decode_thread(AVCodecContext *c, void *arg)
if (c->err_recognition & AV_EF_EXPLODE) if (c->err_recognition & AV_EF_EXPLODE)
return ret; return ret;
if (s->resync_mb_x >= 0 && s->resync_mb_y >= 0) if (s->resync_mb_x >= 0 && s->resync_mb_y >= 0)
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, AC_ERROR | DC_ERROR | MV_ERROR); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_AC_ERROR | ER_DC_ERROR | ER_MV_ERROR);
} else { } else {
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END | DC_END | MV_END); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_AC_END | ER_DC_END | ER_MV_END);
} }
if (s->mb_y == s->end_mb_y) if (s->mb_y == s->end_mb_y)
...@@ -2504,9 +2504,9 @@ static int decode_chunks(AVCodecContext *avctx, ...@@ -2504,9 +2504,9 @@ static int decode_chunks(AVCodecContext *avctx,
if (avctx->err_recognition & AV_EF_EXPLODE) if (avctx->err_recognition & AV_EF_EXPLODE)
return ret; return ret;
if (s2->resync_mb_x >= 0 && s2->resync_mb_y >= 0) if (s2->resync_mb_x >= 0 && s2->resync_mb_y >= 0)
ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, AC_ERROR | DC_ERROR | MV_ERROR); ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x, s2->mb_y, ER_AC_ERROR | ER_DC_ERROR | ER_MV_ERROR);
} else { } else {
ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, AC_END | DC_END | MV_END); ff_er_add_slice(s2, s2->resync_mb_x, s2->resync_mb_y, s2->mb_x-1, s2->mb_y, ER_AC_END | ER_DC_END | ER_MV_END);
} }
} }
} }
......
...@@ -786,8 +786,8 @@ static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){ ...@@ -786,8 +786,8 @@ static int mpeg4_decode_partition_b(MpegEncContext *s, int mb_count){
int ff_mpeg4_decode_partitions(MpegEncContext *s) int ff_mpeg4_decode_partitions(MpegEncContext *s)
{ {
int mb_num; int mb_num;
const int part_a_error= s->pict_type==AV_PICTURE_TYPE_I ? (DC_ERROR|MV_ERROR) : MV_ERROR; const int part_a_error= s->pict_type==AV_PICTURE_TYPE_I ? (ER_DC_ERROR|ER_MV_ERROR) : ER_MV_ERROR;
const int part_a_end = s->pict_type==AV_PICTURE_TYPE_I ? (DC_END |MV_END) : MV_END; const int part_a_end = s->pict_type==AV_PICTURE_TYPE_I ? (ER_DC_END |ER_MV_END) : ER_MV_END;
mb_num= mpeg4_decode_partition_a(s); mb_num= mpeg4_decode_partition_a(s);
if(mb_num<0){ if(mb_num<0){
...@@ -822,11 +822,11 @@ int ff_mpeg4_decode_partitions(MpegEncContext *s) ...@@ -822,11 +822,11 @@ int ff_mpeg4_decode_partitions(MpegEncContext *s)
if( mpeg4_decode_partition_b(s, mb_num) < 0){ if( mpeg4_decode_partition_b(s, mb_num) < 0){
if(s->pict_type==AV_PICTURE_TYPE_P) if(s->pict_type==AV_PICTURE_TYPE_P)
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, DC_ERROR); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, ER_DC_ERROR);
return -1; return -1;
}else{ }else{
if(s->pict_type==AV_PICTURE_TYPE_P) if(s->pict_type==AV_PICTURE_TYPE_P)
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, DC_END); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_DC_END);
} }
return 0; return 0;
......
...@@ -479,13 +479,15 @@ typedef struct MpegEncContext { ...@@ -479,13 +479,15 @@ typedef struct MpegEncContext {
int error_count, error_occurred; int error_count, error_occurred;
uint8_t *error_status_table; ///< table of the error status of each MB uint8_t *error_status_table; ///< table of the error status of each MB
#define VP_START 1 ///< current MB is the first after a resync marker #define VP_START 1 ///< current MB is the first after a resync marker
#define AC_ERROR 2 #define ER_AC_ERROR 2
#define DC_ERROR 4 #define ER_DC_ERROR 4
#define MV_ERROR 8 #define ER_MV_ERROR 8
#define AC_END 16 #define ER_AC_END 16
#define DC_END 32 #define ER_DC_END 32
#define MV_END 64 #define ER_MV_END 64
//FIXME some prefix?
#define ER_MB_ERROR (ER_AC_ERROR|ER_DC_ERROR|ER_MV_ERROR)
#define ER_MB_END (ER_AC_END|ER_DC_END|ER_MV_END)
int resync_mb_x; ///< x position of last resync marker int resync_mb_x; ///< x position of last resync marker
int resync_mb_y; ///< y position of last resync marker int resync_mb_y; ///< y position of last resync marker
......
...@@ -626,7 +626,7 @@ static int rv10_decode_packet(AVCodecContext *avctx, ...@@ -626,7 +626,7 @@ static int rv10_decode_packet(AVCodecContext *avctx,
if(ret == SLICE_END) break; if(ret == SLICE_END) break;
} }
ff_er_add_slice(s, start_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); ff_er_add_slice(s, start_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
return s->gb.size_in_bits; return s->gb.size_in_bits;
} }
......
...@@ -288,20 +288,6 @@ static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *r ...@@ -288,20 +288,6 @@ static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *r
} }
/**
* Dequantize ordinary 4x4 block.
* @todo optimize
*/
static inline void rv34_dequant4x4(DCTELEM *block, int Qdc, int Q)
{
int i, j;
block[0] = (block[0] * Qdc + 8) >> 4;
for(i = 0; i < 4; i++)
for(j = !i; j < 4; j++)
block[j + i*8] = (block[j + i*8] * Q + 8) >> 4;
}
/** /**
* Dequantize 4x4 block of DC values for 16x16 macroblock. * Dequantize 4x4 block of DC values for 16x16 macroblock.
* @todo optimize * @todo optimize
...@@ -1159,7 +1145,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) ...@@ -1159,7 +1145,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types)
blkoff = ((i & 1) << 2) + ((i & 4) << 3); blkoff = ((i & 1) << 2) + ((i & 4) << 3);
if(cbp & 1) if(cbp & 1)
rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->luma_vlc, 0); rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->luma_vlc, 0);
rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[s->qscale],rv34_qscale_tab[s->qscale]); r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[s->qscale],rv34_qscale_tab[s->qscale]);
if(r->is16) //FIXME: optimize if(r->is16) //FIXME: optimize
s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)]; s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)];
r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff); r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff);
...@@ -1171,7 +1157,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) ...@@ -1171,7 +1157,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types)
blknum = ((i & 4) >> 2) + 4; blknum = ((i & 4) >> 2) + 4;
blkoff = ((i & 1) << 2) + ((i & 2) << 4); blkoff = ((i & 1) << 2) + ((i & 2) << 4);
rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1); rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1);
rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]],rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]]); r->rdsp.rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]],rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]]);
r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff); r->rdsp.rv34_inv_transform_tab[0](s->block[blknum] + blkoff);
} }
if (IS_INTRA(s->current_picture_ptr->f.mb_type[mb_pos])) if (IS_INTRA(s->current_picture_ptr->f.mb_type[mb_pos]))
...@@ -1296,7 +1282,7 @@ static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int ...@@ -1296,7 +1282,7 @@ static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int
s->dsp.clear_blocks(s->block[0]); s->dsp.clear_blocks(s->block[0]);
if(rv34_decode_macroblock(r, r->intra_types + s->mb_x * 4 + 4) < 0){ if(rv34_decode_macroblock(r, r->intra_types + s->mb_x * 4 + 4) < 0){
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_ERROR);
return -1; return -1;
} }
if (++s->mb_x == s->mb_width) { if (++s->mb_x == s->mb_width) {
...@@ -1314,7 +1300,7 @@ static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int ...@@ -1314,7 +1300,7 @@ static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int
s->first_slice_line=0; s->first_slice_line=0;
s->mb_num_left--; s->mb_num_left--;
} }
ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
return s->mb_y == s->mb_height; return s->mb_y == s->mb_height;
} }
......
...@@ -100,10 +100,26 @@ static void rv34_inv_transform_noround_c(DCTELEM *block){ ...@@ -100,10 +100,26 @@ static void rv34_inv_transform_noround_c(DCTELEM *block){
/** @} */ // transform /** @} */ // transform
/**
* Dequantize ordinary 4x4 block.
*/
void ff_rv34_dequant4x4_neon(DCTELEM *block, int Qdc, int Q);
static void rv34_dequant4x4_c(DCTELEM *block, int Qdc, int Q)
{
int i, j;
block[0] = (block[0] * Qdc + 8) >> 4;
for (i = 0; i < 4; i++)
for (j = !i; j < 4; j++)
block[j + i*8] = (block[j + i*8] * Q + 8) >> 4;
}
av_cold void ff_rv34dsp_init(RV34DSPContext *c, DSPContext* dsp) { av_cold void ff_rv34dsp_init(RV34DSPContext *c, DSPContext* dsp) {
c->rv34_inv_transform_tab[0] = rv34_inv_transform_c; c->rv34_inv_transform_tab[0] = rv34_inv_transform_c;
c->rv34_inv_transform_tab[1] = rv34_inv_transform_noround_c; c->rv34_inv_transform_tab[1] = rv34_inv_transform_noround_c;
c->rv34_dequant4x4 = rv34_dequant4x4_c;
if (HAVE_NEON) if (HAVE_NEON)
ff_rv34dsp_init_neon(c, dsp); ff_rv34dsp_init_neon(c, dsp);
} }
...@@ -48,6 +48,7 @@ typedef struct RV34DSPContext { ...@@ -48,6 +48,7 @@ typedef struct RV34DSPContext {
h264_chroma_mc_func avg_chroma_pixels_tab[3]; h264_chroma_mc_func avg_chroma_pixels_tab[3];
rv40_weight_func rv40_weight_pixels_tab[2]; rv40_weight_func rv40_weight_pixels_tab[2];
rv34_inv_transform_func rv34_inv_transform_tab[2]; rv34_inv_transform_func rv34_inv_transform_tab[2];
void (*rv34_dequant4x4)(DCTELEM *block, int Qdc, int Q);
rv40_loop_filter_func rv40_h_loop_filter; rv40_loop_filter_func rv40_h_loop_filter;
rv40_loop_filter_func rv40_v_loop_filter; rv40_loop_filter_func rv40_v_loop_filter;
} RV34DSPContext; } RV34DSPContext;
......
...@@ -40,6 +40,14 @@ typedef struct UltimotionDecodeContext { ...@@ -40,6 +40,14 @@ typedef struct UltimotionDecodeContext {
const uint8_t *ulti_codebook; const uint8_t *ulti_codebook;
} UltimotionDecodeContext; } UltimotionDecodeContext;
#define CHECK_OVERREAD_SIZE(size) \
do { \
if (buf_end - buf < (size)) { \
av_log(avctx, AV_LOG_ERROR, "Insufficient data\n"); \
return AVERROR_INVALIDDATA; \
} \
} while(0)
static av_cold int ulti_decode_init(AVCodecContext *avctx) static av_cold int ulti_decode_init(AVCodecContext *avctx)
{ {
UltimotionDecodeContext *s = avctx->priv_data; UltimotionDecodeContext *s = avctx->priv_data;
...@@ -224,6 +232,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -224,6 +232,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
int i; int i;
int skip; int skip;
int tmp; int tmp;
const uint8_t *buf_end = buf + buf_size;
s->frame.reference = 3; s->frame.reference = 3;
s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
...@@ -237,10 +246,12 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -237,10 +246,12 @@ static int ulti_decode_frame(AVCodecContext *avctx,
if(blocks >= s->blocks || y >= s->height) if(blocks >= s->blocks || y >= s->height)
break;//all blocks decoded break;//all blocks decoded
CHECK_OVERREAD_SIZE(1);
idx = *buf++; idx = *buf++;
if((idx & 0xF8) == 0x70) { if((idx & 0xF8) == 0x70) {
switch(idx) { switch(idx) {
case 0x70: //change modifier case 0x70: //change modifier
CHECK_OVERREAD_SIZE(1);
modifier = *buf++; modifier = *buf++;
if(modifier>1) if(modifier>1)
av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier); av_log(avctx, AV_LOG_INFO, "warning: modifier must be 0 or 1, got %i\n", modifier);
...@@ -255,6 +266,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -255,6 +266,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
done = 1; done = 1;
break; break;
case 0x74: //skip some blocks case 0x74: //skip some blocks
CHECK_OVERREAD_SIZE(1);
skip = *buf++; skip = *buf++;
if ((blocks + skip) >= s->blocks) if ((blocks + skip) >= s->blocks)
break; break;
...@@ -281,19 +293,24 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -281,19 +293,24 @@ static int ulti_decode_frame(AVCodecContext *avctx,
chroma = 0; chroma = 0;
} else { } else {
cf = 0; cf = 0;
if (idx) if (idx) {
CHECK_OVERREAD_SIZE(1);
chroma = *buf++; chroma = *buf++;
}
} }
for (i = 0; i < 4; i++) { // for every subblock for (i = 0; i < 4; i++) { // for every subblock
code = (idx >> (6 - i*2)) & 3; //extract 2 bits code = (idx >> (6 - i*2)) & 3; //extract 2 bits
if(!code) //skip subblock if(!code) //skip subblock
continue; continue;
if(cf) if(cf) {
CHECK_OVERREAD_SIZE(1);
chroma = *buf++; chroma = *buf++;
}
tx = x + block_coords[i * 2]; tx = x + block_coords[i * 2];
ty = y + block_coords[(i * 2) + 1]; ty = y + block_coords[(i * 2) + 1];
switch(code) { switch(code) {
case 1: case 1:
CHECK_OVERREAD_SIZE(1);
tmp = *buf++; tmp = *buf++;
angle = angle_by_index[(tmp >> 6) & 0x3]; angle = angle_by_index[(tmp >> 6) & 0x3];
...@@ -314,6 +331,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -314,6 +331,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
case 2: case 2:
if (modifier) { // unpack four luma samples if (modifier) { // unpack four luma samples
CHECK_OVERREAD_SIZE(3);
tmp = bytestream_get_be24(&buf); tmp = bytestream_get_be24(&buf);
Y[0] = (tmp >> 18) & 0x3F; Y[0] = (tmp >> 18) & 0x3F;
...@@ -322,6 +340,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -322,6 +340,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
Y[3] = tmp & 0x3F; Y[3] = tmp & 0x3F;
angle = 16; angle = 16;
} else { // retrieve luma samples from codebook } else { // retrieve luma samples from codebook
CHECK_OVERREAD_SIZE(2);
tmp = bytestream_get_be16(&buf); tmp = bytestream_get_be16(&buf);
angle = (tmp >> 12) & 0xF; angle = (tmp >> 12) & 0xF;
...@@ -338,6 +357,8 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -338,6 +357,8 @@ static int ulti_decode_frame(AVCodecContext *avctx,
if (modifier) { // all 16 luma samples if (modifier) { // all 16 luma samples
uint8_t Luma[16]; uint8_t Luma[16];
CHECK_OVERREAD_SIZE(12);
tmp = bytestream_get_be24(&buf); tmp = bytestream_get_be24(&buf);
Luma[0] = (tmp >> 18) & 0x3F; Luma[0] = (tmp >> 18) & 0x3F;
Luma[1] = (tmp >> 12) & 0x3F; Luma[1] = (tmp >> 12) & 0x3F;
...@@ -364,6 +385,7 @@ static int ulti_decode_frame(AVCodecContext *avctx, ...@@ -364,6 +385,7 @@ static int ulti_decode_frame(AVCodecContext *avctx,
ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma); ulti_convert_yuv(&s->frame, tx, ty, Luma, chroma);
} else { } else {
CHECK_OVERREAD_SIZE(4);
tmp = *buf++; tmp = *buf++;
if(tmp & 0x80) { if(tmp & 0x80) {
angle = (tmp >> 4) & 0x7; angle = (tmp >> 4) & 0x7;
......
...@@ -4548,7 +4548,7 @@ static void vc1_decode_i_blocks(VC1Context *v) ...@@ -4548,7 +4548,7 @@ static void vc1_decode_i_blocks(VC1Context *v)
if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq); if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
if (get_bits_count(&s->gb) > v->bits) { if (get_bits_count(&s->gb) > v->bits) {
ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR);
av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
get_bits_count(&s->gb), v->bits); get_bits_count(&s->gb), v->bits);
return; return;
...@@ -4563,7 +4563,7 @@ static void vc1_decode_i_blocks(VC1Context *v) ...@@ -4563,7 +4563,7 @@ static void vc1_decode_i_blocks(VC1Context *v)
} }
if (v->s.loop_filter) if (v->s.loop_filter)
ff_draw_horiz_band(s, (s->mb_height - 1) * 16, 16); ff_draw_horiz_band(s, (s->mb_height - 1) * 16, 16);
ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END)); ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
} }
/** Decode blocks of I-frame for advanced profile /** Decode blocks of I-frame for advanced profile
...@@ -4673,7 +4673,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) ...@@ -4673,7 +4673,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
if (get_bits_count(&s->gb) > v->bits) { if (get_bits_count(&s->gb) > v->bits) {
// TODO: may need modification to handle slice coding // TODO: may need modification to handle slice coding
ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
get_bits_count(&s->gb), v->bits); get_bits_count(&s->gb), v->bits);
return; return;
...@@ -4698,7 +4698,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) ...@@ -4698,7 +4698,7 @@ static void vc1_decode_i_blocks_adv(VC1Context *v)
if (v->s.loop_filter) if (v->s.loop_filter)
ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16); ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
(s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END)); (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
} }
static void vc1_decode_p_blocks(VC1Context *v) static void vc1_decode_p_blocks(VC1Context *v)
...@@ -4749,7 +4749,7 @@ static void vc1_decode_p_blocks(VC1Context *v) ...@@ -4749,7 +4749,7 @@ static void vc1_decode_p_blocks(VC1Context *v)
vc1_apply_p_loop_filter(v); vc1_apply_p_loop_filter(v);
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
// TODO: may need modification to handle slice coding // TODO: may need modification to handle slice coding
ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)); ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y); get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
return; return;
...@@ -4773,7 +4773,7 @@ static void vc1_decode_p_blocks(VC1Context *v) ...@@ -4773,7 +4773,7 @@ static void vc1_decode_p_blocks(VC1Context *v)
if (s->end_mb_y >= s->start_mb_y) if (s->end_mb_y >= s->start_mb_y)
ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16); ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
(s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END)); (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
} }
static void vc1_decode_b_blocks(VC1Context *v) static void vc1_decode_b_blocks(VC1Context *v)
...@@ -4818,7 +4818,7 @@ static void vc1_decode_b_blocks(VC1Context *v) ...@@ -4818,7 +4818,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
vc1_decode_b_mb(v); vc1_decode_b_mb(v);
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
// TODO: may need modification to handle slice coding // TODO: may need modification to handle slice coding
ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)); ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y); get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
return; return;
...@@ -4834,14 +4834,14 @@ static void vc1_decode_b_blocks(VC1Context *v) ...@@ -4834,14 +4834,14 @@ static void vc1_decode_b_blocks(VC1Context *v)
if (v->s.loop_filter) if (v->s.loop_filter)
ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16); ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
(s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END)); (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
} }
static void vc1_decode_skip_blocks(VC1Context *v) static void vc1_decode_skip_blocks(VC1Context *v)
{ {
MpegEncContext *s = &v->s; MpegEncContext *s = &v->s;
ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END)); ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, ER_MB_END);
s->first_slice_line = 1; s->first_slice_line = 1;
for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
s->mb_x = 0; s->mb_x = 0;
......
...@@ -41,5 +41,3 @@ SKIPHEADERS-$(HAVE_ALSA_ASOUNDLIB_H) += alsa-audio.h ...@@ -41,5 +41,3 @@ SKIPHEADERS-$(HAVE_ALSA_ASOUNDLIB_H) += alsa-audio.h
SKIPHEADERS-$(HAVE_SNDIO_H) += sndio_common.h SKIPHEADERS-$(HAVE_SNDIO_H) += sndio_common.h
TESTPROGS = timefilter TESTPROGS = timefilter
include $(SRC_PATH)/subdir.mak
...@@ -163,5 +163,3 @@ DIRS = x86 libmpcodecs ...@@ -163,5 +163,3 @@ DIRS = x86 libmpcodecs
TESTPROGS = formats TESTPROGS = formats
TOOLS = graph2dot lavfi-showfiltfmts TOOLS = graph2dot lavfi-showfiltfmts
include $(SRC_PATH)/subdir.mak
...@@ -143,7 +143,7 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic, ...@@ -143,7 +143,7 @@ static void filter(AVFilterContext *ctx, AVFilterBufferRef *dstpic,
int w = dstpic->video->w; int w = dstpic->video->w;
int h = dstpic->video->h; int h = dstpic->video->h;
int refs = yadif->cur->linesize[i]; int refs = yadif->cur->linesize[i];
int df = (yadif->csp->comp[i].depth_minus1+1) / 8; int df = (yadif->csp->comp[i].depth_minus1 + 8) / 8;
if (i == 1 || i == 2) { if (i == 1 || i == 2) {
/* Why is this not part of the per-plane description thing? */ /* Why is this not part of the per-plane description thing? */
...@@ -210,7 +210,7 @@ static void return_frame(AVFilterContext *ctx, int is_second) ...@@ -210,7 +210,7 @@ static void return_frame(AVFilterContext *ctx, int is_second)
if (!yadif->csp) if (!yadif->csp)
yadif->csp = &av_pix_fmt_descriptors[link->format]; yadif->csp = &av_pix_fmt_descriptors[link->format];
if (yadif->csp->comp[0].depth_minus1 == 15) if (yadif->csp->comp[0].depth_minus1 / 8 == 1)
yadif->filter_line = (void*)filter_line_c_16bit; yadif->filter_line = (void*)filter_line_c_16bit;
filter(ctx, yadif->out, tff ^ !is_second, tff); filter(ctx, yadif->out, tff ^ !is_second, tff);
...@@ -352,6 +352,9 @@ static int query_formats(AVFilterContext *ctx) ...@@ -352,6 +352,9 @@ static int query_formats(AVFilterContext *ctx)
AV_NE( PIX_FMT_GRAY16BE, PIX_FMT_GRAY16LE ), AV_NE( PIX_FMT_GRAY16BE, PIX_FMT_GRAY16LE ),
PIX_FMT_YUV440P, PIX_FMT_YUV440P,
PIX_FMT_YUVJ440P, PIX_FMT_YUVJ440P,
AV_NE( PIX_FMT_YUV420P10BE, PIX_FMT_YUV420P10LE ),
AV_NE( PIX_FMT_YUV422P10BE, PIX_FMT_YUV422P10LE ),
AV_NE( PIX_FMT_YUV444P10BE, PIX_FMT_YUV444P10LE ),
AV_NE( PIX_FMT_YUV420P16BE, PIX_FMT_YUV420P16LE ), AV_NE( PIX_FMT_YUV420P16BE, PIX_FMT_YUV420P16LE ),
AV_NE( PIX_FMT_YUV422P16BE, PIX_FMT_YUV422P16LE ), AV_NE( PIX_FMT_YUV422P16BE, PIX_FMT_YUV422P16LE ),
AV_NE( PIX_FMT_YUV444P16BE, PIX_FMT_YUV444P16LE ), AV_NE( PIX_FMT_YUV444P16BE, PIX_FMT_YUV444P16LE ),
......
...@@ -369,5 +369,3 @@ OBJS-$(CONFIG_UDP_PROTOCOL) += udp.o ...@@ -369,5 +369,3 @@ OBJS-$(CONFIG_UDP_PROTOCOL) += udp.o
TESTPROGS = seek TESTPROGS = seek
TOOLS = pktdumper probetest TOOLS = pktdumper probetest
include $(SRC_PATH)/subdir.mak
...@@ -3504,7 +3504,7 @@ fail: ...@@ -3504,7 +3504,7 @@ fail:
av_freep(&s->streams[i]->priv_data); av_freep(&s->streams[i]->priv_data);
av_freep(&s->streams[i]->index_entries); av_freep(&s->streams[i]->index_entries);
} }
if (s->iformat && s->iformat->priv_class) if (s->oformat->priv_class)
av_opt_free(s->priv_data); av_opt_free(s->priv_data);
av_freep(&s->priv_data); av_freep(&s->priv_data);
return ret; return ret;
......
...@@ -86,6 +86,4 @@ DIRS = arm bfin sh4 x86 ...@@ -86,6 +86,4 @@ DIRS = arm bfin sh4 x86
ARCH_HEADERS = bswap.h intmath.h intreadwrite.h timer.h ARCH_HEADERS = bswap.h intmath.h intreadwrite.h timer.h
include $(SRC_PATH)/subdir.mak
$(SUBDIR)lzo-test$(EXESUF): ELIBS = -llzo2 $(SUBDIR)lzo-test$(EXESUF): ELIBS = -llzo2
...@@ -6,5 +6,3 @@ FFLIBS = avutil ...@@ -6,5 +6,3 @@ FFLIBS = avutil
HEADERS = postprocess.h HEADERS = postprocess.h
OBJS = postprocess.o OBJS = postprocess.o
include $(SRC_PATH)/subdir.mak
...@@ -8,5 +8,3 @@ HEADERS = swresample.h ...@@ -8,5 +8,3 @@ HEADERS = swresample.h
OBJS = swresample.o audioconvert.o resample.o rematrix.o OBJS = swresample.o audioconvert.o resample.o rematrix.o
TESTPROGS = swresample_test TESTPROGS = swresample_test
include $(SRC_PATH)/subdir.mak
...@@ -26,5 +26,3 @@ $(SUBDIR)x86/swscale_mmx.o: CFLAGS += $(NOREDZONE_FLAGS) ...@@ -26,5 +26,3 @@ $(SUBDIR)x86/swscale_mmx.o: CFLAGS += $(NOREDZONE_FLAGS)
TESTPROGS = colorspace swscale TESTPROGS = colorspace swscale
DIRS = bfin mlib ppc sparc x86 DIRS = bfin mlib ppc sparc x86
include $(SRC_PATH)/subdir.mak
...@@ -127,4 +127,4 @@ ...@@ -127,4 +127,4 @@
0, 472500, 84480, 0x13962590 0, 472500, 84480, 0x13962590
0, 476250, 84480, 0xde79482f 0, 476250, 84480, 0xde79482f
0, 480000, 84480, 0x7d1ca064 0, 480000, 84480, 0x7d1ca064
0, 483750, 84480, 0x7e1de54e 0, 483750, 84480, 0x0998a064
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment