* qatar/master: (29 commits) amrwb: remove duplicate arguments from extrapolate_isf(). amrwb: error out early if mode is invalid. h264: change underread for 10bit QPEL to overread. matroska: check buffer size for RM-style byte reordering. vp8: disable mmx functions with sse/sse2 counterparts on x86-64. vp8: change int stride to ptrdiff_t stride. wma: fix invalid buffer size assumptions causing random overreads. Windows Media Audio Lossless decoder rv10/20: Fix slice overflow with checked bitstream reader. h263dec: Disallow width/height changing with frame threads. rv10/20: Fix a buffer overread caused by losing track of the remaining buffer size. rmdec: Honor .RMF tag size rather than assuming 18. g722: Fix the QMF scaling r3d: don't set codec timebase. electronicarts: set timebase for tgv video. electronicarts: parse the framerate for cmv video. ogg: don't set codec timebase electronicarts: don't set codec timebase avs: don't set codec timebase wavpack: Fix an integer overflow ... Conflicts: libavcodec/arm/vp8dsp_init_arm.c libavcodec/fraps.c libavcodec/h264.c libavcodec/mpeg4videodec.c libavcodec/mpegvideo.c libavcodec/msmpeg4.c libavcodec/pnmdec.c libavcodec/qpeg.c libavcodec/rawenc.c libavcodec/ulti.c libavcodec/vcr1.c libavcodec/version.h libavcodec/wmalosslessdec.c libavformat/electronicarts.c libswscale/ppc/yuv2rgb_altivec.c tests/ref/acodec/g722 tests/ref/fate/ea-cmv Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.11
@@ -9,6 +9,7 @@ version next: | |||||
- ffprobe -count_packets and -count_frames options | - ffprobe -count_packets and -count_frames options | ||||
- Sun Rasterfile Encoder | - Sun Rasterfile Encoder | ||||
- ID3v2 attached pictures reading and writing | - ID3v2 attached pictures reading and writing | ||||
- WMA Lossless decoder | |||||
version 0.10: | version 0.10: | ||||
@@ -811,6 +811,7 @@ following image formats are supported: | |||||
@item Westwood Audio (SND1) @tab @tab X | @item Westwood Audio (SND1) @tab @tab X | ||||
@item Windows Media Audio 1 @tab X @tab X | @item Windows Media Audio 1 @tab X @tab X | ||||
@item Windows Media Audio 2 @tab X @tab X | @item Windows Media Audio 2 @tab X @tab X | ||||
@item Windows Media Audio Lossless @tab @tab X | |||||
@item Windows Media Audio Pro @tab @tab X | @item Windows Media Audio Pro @tab @tab X | ||||
@item Windows Media Audio Voice @tab @tab X | @item Windows Media Audio Voice @tab @tab X | ||||
@end multitable | @end multitable | ||||
@@ -299,12 +299,14 @@ OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o | |||||
OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.o | OBJS-$(CONFIG_MSMPEG4V1_DECODER) += msmpeg4.o msmpeg4data.o | ||||
OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | ||||
h263.o ituh263dec.o mpeg4videodec.o | h263.o ituh263dec.o mpeg4videodec.o | ||||
OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | |||||
h263.o ituh263dec.o mpeg4videodec.o | |||||
OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4.o msmpeg4enc.o msmpeg4data.o \ | |||||
h263dec.o h263.o ituh263dec.o \ | |||||
mpeg4videodec.o | |||||
OBJS-$(CONFIG_MSMPEG4V3_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | OBJS-$(CONFIG_MSMPEG4V3_DECODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | ||||
h263.o ituh263dec.o mpeg4videodec.o | h263.o ituh263dec.o mpeg4videodec.o | ||||
OBJS-$(CONFIG_MSMPEG4V3_ENCODER) += msmpeg4.o msmpeg4data.o h263dec.o \ | |||||
h263.o ituh263dec.o mpeg4videodec.o | |||||
OBJS-$(CONFIG_MSMPEG4V3_ENCODER) += msmpeg4.o msmpeg4enc.o msmpeg4data.o \ | |||||
h263dec.o h263.o ituh263dec.o \ | |||||
mpeg4videodec.o | |||||
OBJS-$(CONFIG_MSRLE_DECODER) += msrle.o msrledec.o | OBJS-$(CONFIG_MSRLE_DECODER) += msrle.o msrledec.o | ||||
OBJS-$(CONFIG_MSVIDEO1_DECODER) += msvideo1.o | OBJS-$(CONFIG_MSVIDEO1_DECODER) += msvideo1.o | ||||
OBJS-$(CONFIG_MSVIDEO1_ENCODER) += msvideo1enc.o elbg.o | OBJS-$(CONFIG_MSVIDEO1_ENCODER) += msvideo1enc.o elbg.o | ||||
@@ -471,7 +473,7 @@ OBJS-$(CONFIG_WMV2_DECODER) += wmv2dec.o wmv2.o \ | |||||
msmpeg4.o msmpeg4data.o \ | msmpeg4.o msmpeg4data.o \ | ||||
intrax8.o intrax8dsp.o | intrax8.o intrax8dsp.o | ||||
OBJS-$(CONFIG_WMV2_ENCODER) += wmv2enc.o wmv2.o \ | OBJS-$(CONFIG_WMV2_ENCODER) += wmv2enc.o wmv2.o \ | ||||
msmpeg4.o msmpeg4data.o \ | |||||
msmpeg4.o msmpeg4enc.o msmpeg4data.o \ | |||||
mpeg4videodec.o ituh263dec.o h263dec.o | mpeg4videodec.o ituh263dec.o h263dec.o | ||||
OBJS-$(CONFIG_WNV1_DECODER) += wnv1.o | OBJS-$(CONFIG_WNV1_DECODER) += wnv1.o | ||||
OBJS-$(CONFIG_WS_SND1_DECODER) += ws-snd1.o | OBJS-$(CONFIG_WS_SND1_DECODER) += ws-snd1.o | ||||
@@ -246,7 +246,7 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
A64Context *c = avctx->priv_data; | A64Context *c = avctx->priv_data; | ||||
AVFrame *const p = (AVFrame *) & c->picture; | |||||
AVFrame *const p = &c->picture; | |||||
int frame; | int frame; | ||||
int x, y; | int x, y; | ||||
@@ -898,10 +898,10 @@ static float auto_correlation(float *diff_isf, float mean, int lag) | |||||
* Extrapolate a ISF vector to the 16kHz range (20th order LP) | * Extrapolate a ISF vector to the 16kHz range (20th order LP) | ||||
* used at mode 6k60 LP filter for the high frequency band. | * used at mode 6k60 LP filter for the high frequency band. | ||||
* | * | ||||
* @param[out] out Buffer for extrapolated isf | |||||
* @param[in] isf Input isf vector | |||||
* @param[out] isf Buffer for extrapolated isf; contains LP_ORDER | |||||
* values on input | |||||
*/ | */ | ||||
static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER]) | |||||
static void extrapolate_isf(float isf[LP_ORDER_16k]) | |||||
{ | { | ||||
float diff_isf[LP_ORDER - 2], diff_mean; | float diff_isf[LP_ORDER - 2], diff_mean; | ||||
float *diff_hi = diff_isf - LP_ORDER + 1; // diff array for extrapolated indexes | float *diff_hi = diff_isf - LP_ORDER + 1; // diff array for extrapolated indexes | ||||
@@ -909,8 +909,7 @@ static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER]) | |||||
float est, scale; | float est, scale; | ||||
int i, i_max_corr; | int i, i_max_corr; | ||||
memcpy(out, isf, (LP_ORDER - 1) * sizeof(float)); | |||||
out[LP_ORDER_16k - 1] = isf[LP_ORDER - 1]; | |||||
isf[LP_ORDER_16k - 1] = isf[LP_ORDER - 1]; | |||||
/* Calculate the difference vector */ | /* Calculate the difference vector */ | ||||
for (i = 0; i < LP_ORDER - 2; i++) | for (i = 0; i < LP_ORDER - 2; i++) | ||||
@@ -931,16 +930,16 @@ static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER]) | |||||
i_max_corr++; | i_max_corr++; | ||||
for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) | for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) | ||||
out[i] = isf[i - 1] + isf[i - 1 - i_max_corr] | |||||
isf[i] = isf[i - 1] + isf[i - 1 - i_max_corr] | |||||
- isf[i - 2 - i_max_corr]; | - isf[i - 2 - i_max_corr]; | ||||
/* Calculate an estimate for ISF(18) and scale ISF based on the error */ | /* Calculate an estimate for ISF(18) and scale ISF based on the error */ | ||||
est = 7965 + (out[2] - out[3] - out[4]) / 6.0; | |||||
scale = 0.5 * (FFMIN(est, 7600) - out[LP_ORDER - 2]) / | |||||
(out[LP_ORDER_16k - 2] - out[LP_ORDER - 2]); | |||||
est = 7965 + (isf[2] - isf[3] - isf[4]) / 6.0; | |||||
scale = 0.5 * (FFMIN(est, 7600) - isf[LP_ORDER - 2]) / | |||||
(isf[LP_ORDER_16k - 2] - isf[LP_ORDER - 2]); | |||||
for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) | for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) | ||||
diff_hi[i] = scale * (out[i] - out[i - 1]); | |||||
diff_hi[i] = scale * (isf[i] - isf[i - 1]); | |||||
/* Stability insurance */ | /* Stability insurance */ | ||||
for (i = LP_ORDER; i < LP_ORDER_16k - 1; i++) | for (i = LP_ORDER; i < LP_ORDER_16k - 1; i++) | ||||
@@ -952,11 +951,11 @@ static void extrapolate_isf(float out[LP_ORDER_16k], float isf[LP_ORDER]) | |||||
} | } | ||||
for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) | for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) | ||||
out[i] = out[i - 1] + diff_hi[i] * (1.0f / (1 << 15)); | |||||
isf[i] = isf[i - 1] + diff_hi[i] * (1.0f / (1 << 15)); | |||||
/* Scale the ISF vector for 16000 Hz */ | /* Scale the ISF vector for 16000 Hz */ | ||||
for (i = 0; i < LP_ORDER_16k - 1; i++) | for (i = 0; i < LP_ORDER_16k - 1; i++) | ||||
out[i] *= 0.8; | |||||
isf[i] *= 0.8; | |||||
} | } | ||||
/** | /** | ||||
@@ -1003,7 +1002,7 @@ static void hb_synthesis(AMRWBContext *ctx, int subframe, float *samples, | |||||
ff_weighted_vector_sumf(e_isf, isf_past, isf, isfp_inter[subframe], | ff_weighted_vector_sumf(e_isf, isf_past, isf, isfp_inter[subframe], | ||||
1.0 - isfp_inter[subframe], LP_ORDER); | 1.0 - isfp_inter[subframe], LP_ORDER); | ||||
extrapolate_isf(e_isf, e_isf); | |||||
extrapolate_isf(e_isf); | |||||
e_isf[LP_ORDER_16k - 1] *= 2.0; | e_isf[LP_ORDER_16k - 1] *= 2.0; | ||||
ff_acelp_lsf2lspd(e_isp, e_isf, LP_ORDER_16k); | ff_acelp_lsf2lspd(e_isp, e_isf, LP_ORDER_16k); | ||||
@@ -1095,23 +1094,27 @@ static int amrwb_decode_frame(AVCodecContext *avctx, void *data, | |||||
buf_out = (float *)ctx->avframe.data[0]; | buf_out = (float *)ctx->avframe.data[0]; | ||||
header_size = decode_mime_header(ctx, buf); | header_size = decode_mime_header(ctx, buf); | ||||
if (ctx->fr_cur_mode > MODE_SID) { | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Invalid mode %d\n", ctx->fr_cur_mode); | |||||
return AVERROR_INVALIDDATA; | |||||
} | |||||
expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1; | expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1; | ||||
if (buf_size < expected_fr_size) { | if (buf_size < expected_fr_size) { | ||||
av_log(avctx, AV_LOG_ERROR, | av_log(avctx, AV_LOG_ERROR, | ||||
"Frame too small (%d bytes). Truncated file?\n", buf_size); | "Frame too small (%d bytes). Truncated file?\n", buf_size); | ||||
*got_frame_ptr = 0; | *got_frame_ptr = 0; | ||||
return buf_size; | |||||
return AVERROR_INVALIDDATA; | |||||
} | } | ||||
if (!ctx->fr_quality || ctx->fr_cur_mode > MODE_SID) | if (!ctx->fr_quality || ctx->fr_cur_mode > MODE_SID) | ||||
av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n"); | av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n"); | ||||
if (ctx->fr_cur_mode == MODE_SID) /* Comfort noise frame */ | |||||
if (ctx->fr_cur_mode == MODE_SID) { /* Comfort noise frame */ | |||||
av_log_missing_feature(avctx, "SID mode", 1); | av_log_missing_feature(avctx, "SID mode", 1); | ||||
if (ctx->fr_cur_mode >= MODE_SID) | |||||
return -1; | return -1; | ||||
} | |||||
ff_amr_bit_reorder((uint16_t *) &ctx->frame, sizeof(AMRWBFrame), | ff_amr_bit_reorder((uint16_t *) &ctx->frame, sizeof(AMRWBFrame), | ||||
buf + header_size, amr_bit_orderings_by_mode[ctx->fr_cur_mode]); | buf + header_size, amr_bit_orderings_by_mode[ctx->fr_cur_mode]); | ||||
@@ -23,87 +23,87 @@ void ff_vp8_luma_dc_wht_dc_armv6(DCTELEM block[4][4][16], DCTELEM dc[16]); | |||||
#define idct_funcs(opt) \ | #define idct_funcs(opt) \ | ||||
void ff_vp8_luma_dc_wht_ ## opt(DCTELEM block[4][4][16], DCTELEM dc[16]); \ | void ff_vp8_luma_dc_wht_ ## opt(DCTELEM block[4][4][16], DCTELEM dc[16]); \ | ||||
void ff_vp8_idct_add_ ## opt(uint8_t *dst, DCTELEM block[16], int stride); \ | |||||
void ff_vp8_idct_dc_add_ ## opt(uint8_t *dst, DCTELEM block[16], int stride); \ | |||||
void ff_vp8_idct_dc_add4y_ ## opt(uint8_t *dst, DCTELEM block[4][16], int stride); \ | |||||
void ff_vp8_idct_dc_add4uv_ ## opt(uint8_t *dst, DCTELEM block[4][16], int stride) | |||||
void ff_vp8_idct_add_ ## opt(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride); \ | |||||
void ff_vp8_idct_dc_add_ ## opt(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride); \ | |||||
void ff_vp8_idct_dc_add4y_ ## opt(uint8_t *dst, DCTELEM block[4][16], ptrdiff_t stride); \ | |||||
void ff_vp8_idct_dc_add4uv_ ## opt(uint8_t *dst, DCTELEM block[4][16], ptrdiff_t stride) | |||||
idct_funcs(neon); | idct_funcs(neon); | ||||
idct_funcs(armv6); | idct_funcs(armv6); | ||||
void ff_vp8_v_loop_filter16_neon(uint8_t *dst, int stride, | |||||
void ff_vp8_v_loop_filter16_neon(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void ff_vp8_h_loop_filter16_neon(uint8_t *dst, int stride, | |||||
void ff_vp8_h_loop_filter16_neon(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void ff_vp8_v_loop_filter8uv_neon(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
void ff_vp8_v_loop_filter8uv_neon(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void ff_vp8_h_loop_filter8uv_neon(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
void ff_vp8_h_loop_filter8uv_neon(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void ff_vp8_v_loop_filter16_inner_neon(uint8_t *dst, int stride, | |||||
void ff_vp8_v_loop_filter16_inner_neon(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void ff_vp8_h_loop_filter16_inner_neon(uint8_t *dst, int stride, | |||||
void ff_vp8_h_loop_filter16_inner_neon(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void ff_vp8_v_loop_filter8uv_inner_neon(uint8_t *dstU, uint8_t *dstV, | void ff_vp8_v_loop_filter8uv_inner_neon(uint8_t *dstU, uint8_t *dstV, | ||||
int stride, int flim_E, int flim_I, | |||||
ptrdiff_t stride, int flim_E, int flim_I, | |||||
int hev_thresh); | int hev_thresh); | ||||
void ff_vp8_h_loop_filter8uv_inner_neon(uint8_t *dstU, uint8_t *dstV, | void ff_vp8_h_loop_filter8uv_inner_neon(uint8_t *dstU, uint8_t *dstV, | ||||
int stride, int flim_E, int flim_I, | |||||
ptrdiff_t stride, int flim_E, int flim_I, | |||||
int hev_thresh); | int hev_thresh); | ||||
void ff_vp8_v_loop_filter_inner_armv6(uint8_t *dst, int stride, | |||||
void ff_vp8_v_loop_filter_inner_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, | int flim_E, int flim_I, | ||||
int hev_thresh, int count); | int hev_thresh, int count); | ||||
void ff_vp8_h_loop_filter_inner_armv6(uint8_t *dst, int stride, | |||||
void ff_vp8_h_loop_filter_inner_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, | int flim_E, int flim_I, | ||||
int hev_thresh, int count); | int hev_thresh, int count); | ||||
void ff_vp8_v_loop_filter_armv6(uint8_t *dst, int stride, | |||||
void ff_vp8_v_loop_filter_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, | int flim_E, int flim_I, | ||||
int hev_thresh, int count); | int hev_thresh, int count); | ||||
void ff_vp8_h_loop_filter_armv6(uint8_t *dst, int stride, | |||||
void ff_vp8_h_loop_filter_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, | int flim_E, int flim_I, | ||||
int hev_thresh, int count); | int hev_thresh, int count); | ||||
static void ff_vp8_v_loop_filter16_armv6(uint8_t *dst, int stride, | |||||
static void ff_vp8_v_loop_filter16_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh) | int flim_E, int flim_I, int hev_thresh) | ||||
{ | { | ||||
ff_vp8_v_loop_filter_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ff_vp8_v_loop_filter_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ||||
} | } | ||||
static void ff_vp8_h_loop_filter16_armv6(uint8_t *dst, int stride, | |||||
static void ff_vp8_h_loop_filter16_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh) | int flim_E, int flim_I, int hev_thresh) | ||||
{ | { | ||||
ff_vp8_h_loop_filter_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ff_vp8_h_loop_filter_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ||||
} | } | ||||
static void ff_vp8_v_loop_filter8uv_armv6(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
static void ff_vp8_v_loop_filter8uv_armv6(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh) | int flim_E, int flim_I, int hev_thresh) | ||||
{ | { | ||||
ff_vp8_v_loop_filter_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ff_vp8_v_loop_filter_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ||||
ff_vp8_v_loop_filter_armv6(dstV, stride, flim_E, flim_I, hev_thresh, 2); | ff_vp8_v_loop_filter_armv6(dstV, stride, flim_E, flim_I, hev_thresh, 2); | ||||
} | } | ||||
static void ff_vp8_h_loop_filter8uv_armv6(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
static void ff_vp8_h_loop_filter8uv_armv6(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh) | int flim_E, int flim_I, int hev_thresh) | ||||
{ | { | ||||
ff_vp8_h_loop_filter_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ff_vp8_h_loop_filter_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ||||
ff_vp8_h_loop_filter_armv6(dstV, stride, flim_E, flim_I, hev_thresh, 2); | ff_vp8_h_loop_filter_armv6(dstV, stride, flim_E, flim_I, hev_thresh, 2); | ||||
} | } | ||||
static void ff_vp8_v_loop_filter16_inner_armv6(uint8_t *dst, int stride, | |||||
static void ff_vp8_v_loop_filter16_inner_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh) | int flim_E, int flim_I, int hev_thresh) | ||||
{ | { | ||||
ff_vp8_v_loop_filter_inner_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ff_vp8_v_loop_filter_inner_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ||||
} | } | ||||
static void ff_vp8_h_loop_filter16_inner_armv6(uint8_t *dst, int stride, | |||||
static void ff_vp8_h_loop_filter16_inner_armv6(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh) | int flim_E, int flim_I, int hev_thresh) | ||||
{ | { | ||||
ff_vp8_h_loop_filter_inner_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ff_vp8_h_loop_filter_inner_armv6(dst, stride, flim_E, flim_I, hev_thresh, 4); | ||||
} | } | ||||
static void ff_vp8_v_loop_filter8uv_inner_armv6(uint8_t *dstU, uint8_t *dstV, | static void ff_vp8_v_loop_filter8uv_inner_armv6(uint8_t *dstU, uint8_t *dstV, | ||||
int stride, int flim_E, int flim_I, | |||||
ptrdiff_t stride, int flim_E, int flim_I, | |||||
int hev_thresh) | int hev_thresh) | ||||
{ | { | ||||
ff_vp8_v_loop_filter_inner_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ff_vp8_v_loop_filter_inner_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ||||
@@ -111,7 +111,7 @@ static void ff_vp8_v_loop_filter8uv_inner_armv6(uint8_t *dstU, uint8_t *dstV, | |||||
} | } | ||||
static void ff_vp8_h_loop_filter8uv_inner_armv6(uint8_t *dstU, uint8_t *dstV, | static void ff_vp8_h_loop_filter8uv_inner_armv6(uint8_t *dstU, uint8_t *dstV, | ||||
int stride, int flim_E, int flim_I, | |||||
ptrdiff_t stride, int flim_E, int flim_I, | |||||
int hev_thresh) | int hev_thresh) | ||||
{ | { | ||||
ff_vp8_h_loop_filter_inner_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ff_vp8_h_loop_filter_inner_armv6(dstU, stride, flim_E, flim_I, hev_thresh, 2); | ||||
@@ -119,16 +119,16 @@ static void ff_vp8_h_loop_filter8uv_inner_armv6(uint8_t *dstU, uint8_t *dstV, | |||||
} | } | ||||
#define simple_lf_funcs(opt) \ | #define simple_lf_funcs(opt) \ | ||||
void ff_vp8_v_loop_filter16_simple_ ## opt(uint8_t *dst, int stride, int flim); \ | |||||
void ff_vp8_h_loop_filter16_simple_ ## opt(uint8_t *dst, int stride, int flim) | |||||
void ff_vp8_v_loop_filter16_simple_ ## opt(uint8_t *dst, ptrdiff_t stride, int flim); \ | |||||
void ff_vp8_h_loop_filter16_simple_ ## opt(uint8_t *dst, ptrdiff_t stride, int flim) | |||||
simple_lf_funcs(neon); | simple_lf_funcs(neon); | ||||
simple_lf_funcs(armv6); | simple_lf_funcs(armv6); | ||||
#define VP8_MC_OPT(n, opt) \ | |||||
void ff_put_vp8_##n##_##opt(uint8_t *dst, int dststride, \ | |||||
uint8_t *src, int srcstride, \ | |||||
int h, int x, int y) | |||||
#define VP8_MC(n) \ | |||||
void ff_put_vp8_##n##_neon(uint8_t *dst, ptrdiff_t dststride, \ | |||||
uint8_t *src, ptrdiff_t srcstride, \ | |||||
int h, int x, int y) | |||||
#define VP8_MC(n) \ | #define VP8_MC(n) \ | ||||
VP8_MC_OPT(n, neon) | VP8_MC_OPT(n, neon) | ||||
@@ -454,7 +454,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
} | } | ||||
} | } | ||||
*picture= *(AVFrame*)&a->picture; | |||||
*picture = a->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
emms_c(); | emms_c(); | ||||
@@ -51,7 +51,7 @@ avs_decode_frame(AVCodecContext * avctx, | |||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
AvsContext *const avs = avctx->priv_data; | AvsContext *const avs = avctx->priv_data; | ||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame *const p = (AVFrame *) & avs->picture; | |||||
AVFrame *const p = &avs->picture; | |||||
const uint8_t *table, *vect; | const uint8_t *table, *vect; | ||||
uint8_t *out; | uint8_t *out; | ||||
int i, j, x, y, stride, vect_w = 3, vect_h = 3; | int i, j, x, y, stride, vect_w = 3, vect_h = 3; | ||||
@@ -151,7 +151,7 @@ avs_decode_frame(AVCodecContext * avctx, | |||||
align_get_bits(&change_map); | align_get_bits(&change_map); | ||||
} | } | ||||
*picture = *(AVFrame *) & avs->picture; | |||||
*picture = avs->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
return buf_size; | return buf_size; | ||||
@@ -27,8 +27,8 @@ | |||||
static av_cold int bmp_decode_init(AVCodecContext *avctx){ | static av_cold int bmp_decode_init(AVCodecContext *avctx){ | ||||
BMPContext *s = avctx->priv_data; | BMPContext *s = avctx->priv_data; | ||||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||||
avctx->coded_frame = (AVFrame*)&s->picture; | |||||
avcodec_get_frame_defaults(&s->picture); | |||||
avctx->coded_frame = &s->picture; | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -34,8 +34,8 @@ static const uint32_t rgb444_masks[] = { 0x0F00, 0x00F0, 0x000F }; | |||||
static av_cold int bmp_encode_init(AVCodecContext *avctx){ | static av_cold int bmp_encode_init(AVCodecContext *avctx){ | ||||
BMPContext *s = avctx->priv_data; | BMPContext *s = avctx->priv_data; | ||||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||||
avctx->coded_frame = (AVFrame*)&s->picture; | |||||
avcodec_get_frame_defaults(&s->picture); | |||||
avctx->coded_frame = &s->picture; | |||||
switch (avctx->pix_fmt) { | switch (avctx->pix_fmt) { | ||||
case PIX_FMT_BGRA: | case PIX_FMT_BGRA: | ||||
@@ -72,7 +72,7 @@ static int bmp_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
BMPContext *s = avctx->priv_data; | BMPContext *s = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
int n_bytes_image, n_bytes_per_row, n_bytes, i, n, hsize, ret; | int n_bytes_image, n_bytes_per_row, n_bytes, i, n, hsize, ret; | ||||
const uint32_t *pal = NULL; | const uint32_t *pal = NULL; | ||||
uint32_t palette256[256]; | uint32_t palette256[256]; | ||||
@@ -501,9 +501,9 @@ static int decode_pic(AVSContext *h) { | |||||
} | } | ||||
/* release last B frame */ | /* release last B frame */ | ||||
if(h->picture.f.data[0]) | if(h->picture.f.data[0]) | ||||
s->avctx->release_buffer(s->avctx, (AVFrame *)&h->picture); | |||||
s->avctx->release_buffer(s->avctx, &h->picture.f); | |||||
s->avctx->get_buffer(s->avctx, (AVFrame *)&h->picture); | |||||
s->avctx->get_buffer(s->avctx, &h->picture.f); | |||||
ff_cavs_init_pic(h); | ff_cavs_init_pic(h); | ||||
h->picture.poc = get_bits(&s->gb,8)*2; | h->picture.poc = get_bits(&s->gb,8)*2; | ||||
@@ -592,7 +592,7 @@ static int decode_pic(AVSContext *h) { | |||||
} | } | ||||
if(h->pic_type != AV_PICTURE_TYPE_B) { | if(h->pic_type != AV_PICTURE_TYPE_B) { | ||||
if(h->DPB[1].f.data[0]) | if(h->DPB[1].f.data[0]) | ||||
s->avctx->release_buffer(s->avctx, (AVFrame *)&h->DPB[1]); | |||||
s->avctx->release_buffer(s->avctx, &h->DPB[1].f); | |||||
h->DPB[1] = h->DPB[0]; | h->DPB[1] = h->DPB[0]; | ||||
h->DPB[0] = h->picture; | h->DPB[0] = h->picture; | ||||
memset(&h->picture,0,sizeof(Picture)); | memset(&h->picture,0,sizeof(Picture)); | ||||
@@ -656,7 +656,7 @@ static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size, | |||||
if (buf_size == 0) { | if (buf_size == 0) { | ||||
if (!s->low_delay && h->DPB[0].f.data[0]) { | if (!s->low_delay && h->DPB[0].f.data[0]) { | ||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
*picture = *(AVFrame *) &h->DPB[0]; | |||||
*picture = h->DPB[0].f; | |||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -676,9 +676,9 @@ static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size, | |||||
case PIC_I_START_CODE: | case PIC_I_START_CODE: | ||||
if(!h->got_keyframe) { | if(!h->got_keyframe) { | ||||
if(h->DPB[0].f.data[0]) | if(h->DPB[0].f.data[0]) | ||||
avctx->release_buffer(avctx, (AVFrame *)&h->DPB[0]); | |||||
avctx->release_buffer(avctx, &h->DPB[0].f); | |||||
if(h->DPB[1].f.data[0]) | if(h->DPB[1].f.data[0]) | ||||
avctx->release_buffer(avctx, (AVFrame *)&h->DPB[1]); | |||||
avctx->release_buffer(avctx, &h->DPB[1].f); | |||||
h->got_keyframe = 1; | h->got_keyframe = 1; | ||||
} | } | ||||
case PIC_PB_START_CODE: | case PIC_PB_START_CODE: | ||||
@@ -692,12 +692,12 @@ static int cavs_decode_frame(AVCodecContext * avctx,void *data, int *data_size, | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
if(h->pic_type != AV_PICTURE_TYPE_B) { | if(h->pic_type != AV_PICTURE_TYPE_B) { | ||||
if(h->DPB[1].f.data[0]) { | if(h->DPB[1].f.data[0]) { | ||||
*picture = *(AVFrame *) &h->DPB[1]; | |||||
*picture = h->DPB[1].f; | |||||
} else { | } else { | ||||
*data_size = 0; | *data_size = 0; | ||||
} | } | ||||
} else | } else | ||||
*picture = *(AVFrame *) &h->picture; | |||||
*picture = h->picture.f; | |||||
break; | break; | ||||
case EXT_START_CODE: | case EXT_START_CODE: | ||||
//mpeg_decode_extension(avctx,buf_ptr, input_size); | //mpeg_decode_extension(avctx,buf_ptr, input_size); | ||||
@@ -613,7 +613,7 @@ skip_mean_and_median: | |||||
if (s->avctx->codec_id == CODEC_ID_H264) { | if (s->avctx->codec_id == CODEC_ID_H264) { | ||||
// FIXME | // FIXME | ||||
} else { | } else { | ||||
ff_thread_await_progress((AVFrame *) s->last_picture_ptr, | |||||
ff_thread_await_progress(&s->last_picture_ptr->f, | |||||
mb_y, 0); | mb_y, 0); | ||||
} | } | ||||
if (!s->last_picture.f.motion_val[0] || | if (!s->last_picture.f.motion_val[0] || | ||||
@@ -786,7 +786,7 @@ static int is_intra_more_likely(MpegEncContext *s) | |||||
if (s->avctx->codec_id == CODEC_ID_H264) { | if (s->avctx->codec_id == CODEC_ID_H264) { | ||||
// FIXME | // FIXME | ||||
} else { | } else { | ||||
ff_thread_await_progress((AVFrame *) s->last_picture_ptr, | |||||
ff_thread_await_progress(&s->last_picture_ptr->f, | |||||
mb_y, 0); | mb_y, 0); | ||||
} | } | ||||
is_intra_likely += s->dsp.sad[0](NULL, last_mb_ptr, mb_ptr , s->linesize, 16); | is_intra_likely += s->dsp.sad[0](NULL, last_mb_ptr, mb_ptr , s->linesize, 16); | ||||
@@ -1170,7 +1170,7 @@ void ff_er_frame_end(MpegEncContext *s) | |||||
if (s->avctx->codec_id == CODEC_ID_H264) { | if (s->avctx->codec_id == CODEC_ID_H264) { | ||||
// FIXME | // FIXME | ||||
} else { | } else { | ||||
ff_thread_await_progress((AVFrame *) s->next_picture_ptr, mb_y, 0); | |||||
ff_thread_await_progress(&s->next_picture_ptr->f, mb_y, 0); | |||||
} | } | ||||
s->mv[0][0][0] = s->next_picture.f.motion_val[0][xy][0] * time_pb / time_pp; | s->mv[0][0][0] = s->next_picture.f.motion_val[0][xy][0] * time_pb / time_pp; | ||||
s->mv[0][0][1] = s->next_picture.f.motion_val[0][xy][1] * time_pb / time_pp; | s->mv[0][0][1] = s->next_picture.f.motion_val[0][xy][1] * time_pb / time_pp; | ||||
@@ -62,7 +62,7 @@ static av_cold int decode_init(AVCodecContext *avctx) | |||||
FrapsContext * const s = avctx->priv_data; | FrapsContext * const s = avctx->priv_data; | ||||
avcodec_get_frame_defaults(&s->frame); | avcodec_get_frame_defaults(&s->frame); | ||||
avctx->coded_frame = (AVFrame*)&s->frame; | |||||
avctx->coded_frame = &s->frame; | |||||
s->avctx = avctx; | s->avctx = avctx; | ||||
s->tmpbuf = NULL; | s->tmpbuf = NULL; | ||||
@@ -132,7 +132,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
FrapsContext * const s = avctx->priv_data; | FrapsContext * const s = avctx->priv_data; | ||||
AVFrame *frame = data; | AVFrame *frame = data; | ||||
AVFrame * const f = (AVFrame*)&s->frame; | |||||
AVFrame * const f = &s->frame; | |||||
uint32_t header; | uint32_t header; | ||||
unsigned int version,header_size; | unsigned int version,header_size; | ||||
unsigned int x, y; | unsigned int x, y; | ||||
@@ -126,8 +126,8 @@ static int g722_decode_frame(AVCodecContext *avctx, void *data, | |||||
c->prev_samples[c->prev_samples_pos++] = rlow - rhigh; | c->prev_samples[c->prev_samples_pos++] = rlow - rhigh; | ||||
ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24, | ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24, | ||||
&xout1, &xout2); | &xout1, &xout2); | ||||
*out_buf++ = av_clip_int16(xout1 >> 12); | |||||
*out_buf++ = av_clip_int16(xout2 >> 12); | |||||
*out_buf++ = av_clip_int16(xout1 >> 11); | |||||
*out_buf++ = av_clip_int16(xout2 >> 11); | |||||
if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) { | if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) { | ||||
memmove(c->prev_samples, c->prev_samples + c->prev_samples_pos - 22, | memmove(c->prev_samples, c->prev_samples + c->prev_samples_pos - 22, | ||||
22 * sizeof(c->prev_samples[0])); | 22 * sizeof(c->prev_samples[0])); | ||||
@@ -136,8 +136,8 @@ static inline void filter_samples(G722Context *c, const int16_t *samples, | |||||
c->prev_samples[c->prev_samples_pos++] = samples[0]; | c->prev_samples[c->prev_samples_pos++] = samples[0]; | ||||
c->prev_samples[c->prev_samples_pos++] = samples[1]; | c->prev_samples[c->prev_samples_pos++] = samples[1]; | ||||
ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24, &xout1, &xout2); | ff_g722_apply_qmf(c->prev_samples + c->prev_samples_pos - 24, &xout1, &xout2); | ||||
*xlow = xout1 + xout2 >> 13; | |||||
*xhigh = xout1 - xout2 >> 13; | |||||
*xlow = xout1 + xout2 >> 14; | |||||
*xhigh = xout1 - xout2 >> 14; | |||||
if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) { | if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) { | ||||
memmove(c->prev_samples, | memmove(c->prev_samples, | ||||
c->prev_samples + c->prev_samples_pos - 22, | c->prev_samples + c->prev_samples_pos - 22, | ||||
@@ -160,7 +160,7 @@ static int gif_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
GIFContext *s = avctx->priv_data; | GIFContext *s = avctx->priv_data; | ||||
AVFrame *const p = (AVFrame *)&s->picture; | |||||
AVFrame *const p = &s->picture; | |||||
uint8_t *outbuf_ptr, *end; | uint8_t *outbuf_ptr, *end; | ||||
int ret; | int ret; | ||||
@@ -628,7 +628,8 @@ retry: | |||||
assert(s->current_picture.f.pict_type == s->current_picture_ptr->f.pict_type); | assert(s->current_picture.f.pict_type == s->current_picture_ptr->f.pict_type); | ||||
assert(s->current_picture.f.pict_type == s->pict_type); | assert(s->current_picture.f.pict_type == s->pict_type); | ||||
*pict= *(AVFrame*)s->current_picture_ptr; | |||||
*pict = s->current_picture_ptr->f; | |||||
ff_print_debug_info(s, pict); | ff_print_debug_info(s, pict); | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
@@ -357,7 +357,7 @@ uint64_t time= rdtsc(); | |||||
if (buf_size == 0) { | if (buf_size == 0) { | ||||
/* special case for last picture */ | /* special case for last picture */ | ||||
if (s->low_delay==0 && s->next_picture_ptr) { | if (s->low_delay==0 && s->next_picture_ptr) { | ||||
*pict= *(AVFrame*)s->next_picture_ptr; | |||||
*pict = s->next_picture_ptr->f; | |||||
s->next_picture_ptr= NULL; | s->next_picture_ptr= NULL; | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
@@ -727,9 +727,9 @@ intrax8_decoded: | |||||
assert(s->current_picture.f.pict_type == s->current_picture_ptr->f.pict_type); | assert(s->current_picture.f.pict_type == s->current_picture_ptr->f.pict_type); | ||||
assert(s->current_picture.f.pict_type == s->pict_type); | assert(s->current_picture.f.pict_type == s->pict_type); | ||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | ||||
*pict= *(AVFrame*)s->current_picture_ptr; | |||||
*pict = s->current_picture_ptr->f; | |||||
} else if (s->last_picture_ptr != NULL) { | } else if (s->last_picture_ptr != NULL) { | ||||
*pict= *(AVFrame*)s->last_picture_ptr; | |||||
*pict = s->last_picture_ptr->f; | |||||
} | } | ||||
if(s->last_picture_ptr || s->low_delay){ | if(s->last_picture_ptr || s->low_delay){ | ||||
@@ -367,14 +367,14 @@ static void await_references(H264Context *h){ | |||||
nrefs[list]--; | nrefs[list]--; | ||||
if(!FIELD_PICTURE && ref_field_picture){ // frame referencing two fields | if(!FIELD_PICTURE && ref_field_picture){ // frame referencing two fields | ||||
ff_thread_await_progress((AVFrame*)ref_pic, FFMIN((row >> 1) - !(row&1), pic_height-1), 1); | |||||
ff_thread_await_progress((AVFrame*)ref_pic, FFMIN((row >> 1) , pic_height-1), 0); | |||||
ff_thread_await_progress(&ref_pic->f, FFMIN((row >> 1) - !(row & 1), pic_height - 1), 1); | |||||
ff_thread_await_progress(&ref_pic->f, FFMIN((row >> 1), pic_height - 1), 0); | |||||
}else if(FIELD_PICTURE && !ref_field_picture){ // field referencing one field of a frame | }else if(FIELD_PICTURE && !ref_field_picture){ // field referencing one field of a frame | ||||
ff_thread_await_progress((AVFrame*)ref_pic, FFMIN(row*2 + ref_field , pic_height-1), 0); | |||||
ff_thread_await_progress(&ref_pic->f, FFMIN(row * 2 + ref_field, pic_height - 1), 0); | |||||
}else if(FIELD_PICTURE){ | }else if(FIELD_PICTURE){ | ||||
ff_thread_await_progress((AVFrame*)ref_pic, FFMIN(row, pic_height-1), ref_field); | |||||
ff_thread_await_progress(&ref_pic->f, FFMIN(row, pic_height - 1), ref_field); | |||||
}else{ | }else{ | ||||
ff_thread_await_progress((AVFrame*)ref_pic, FFMIN(row, pic_height-1), 0); | |||||
ff_thread_await_progress(&ref_pic->f, FFMIN(row, pic_height - 1), 0); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -2507,8 +2507,9 @@ static int field_end(H264Context *h, int in_setup){ | |||||
s->mb_y= 0; | s->mb_y= 0; | ||||
if (!in_setup && !s->dropable) | if (!in_setup && !s->dropable) | ||||
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, (16*s->mb_height >> FIELD_PICTURE) - 1, | |||||
s->picture_structure==PICT_BOTTOM_FIELD); | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, | |||||
(16 * s->mb_height >> FIELD_PICTURE) - 1, | |||||
s->picture_structure == PICT_BOTTOM_FIELD); | |||||
if (CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) | if (CONFIG_H264_VDPAU_DECODER && s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) | ||||
ff_vdpau_h264_set_reference_frames(s); | ff_vdpau_h264_set_reference_frames(s); | ||||
@@ -2906,8 +2907,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0){ | |||||
h->prev_frame_num++; | h->prev_frame_num++; | ||||
h->prev_frame_num %= 1<<h->sps.log2_max_frame_num; | h->prev_frame_num %= 1<<h->sps.log2_max_frame_num; | ||||
s->current_picture_ptr->frame_num= h->prev_frame_num; | s->current_picture_ptr->frame_num= h->prev_frame_num; | ||||
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, INT_MAX, 0); | |||||
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, INT_MAX, 1); | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0); | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 1); | |||||
ff_generate_sliding_window_mmcos(h); | ff_generate_sliding_window_mmcos(h); | ||||
if (ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index) < 0 && | if (ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index) < 0 && | ||||
(s->avctx->err_recognition & AV_EF_EXPLODE)) | (s->avctx->err_recognition & AV_EF_EXPLODE)) | ||||
@@ -3577,8 +3578,8 @@ static void decode_finish_row(H264Context *h){ | |||||
if (s->dropable) return; | if (s->dropable) return; | ||||
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, top + height - 1, | |||||
s->picture_structure==PICT_BOTTOM_FIELD); | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, top + height - 1, | |||||
s->picture_structure == PICT_BOTTOM_FIELD); | |||||
} | } | ||||
static int decode_slice(struct AVCodecContext *avctx, void *arg){ | static int decode_slice(struct AVCodecContext *avctx, void *arg){ | ||||
@@ -4067,7 +4068,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
if(out){ | if(out){ | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
*pict= *(AVFrame*)out; | |||||
*pict = out->f; | |||||
} | } | ||||
return buf_index; | return buf_index; | ||||
@@ -4121,7 +4122,7 @@ not_extra: | |||||
*data_size = 0; /* Wait for second field. */ | *data_size = 0; /* Wait for second field. */ | ||||
if (h->next_output_pic && (h->next_output_pic->sync || h->sync>1)) { | if (h->next_output_pic && (h->next_output_pic->sync || h->sync>1)) { | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
*pict = *(AVFrame*)h->next_output_pic; | |||||
*pict = h->next_output_pic->f; | |||||
} | } | ||||
} | } | ||||
@@ -154,7 +154,8 @@ static void await_reference_mb_row(H264Context * const h, Picture *ref, int mb_y | |||||
//FIXME it can be safe to access mb stuff | //FIXME it can be safe to access mb stuff | ||||
//even if pixels aren't deblocked yet | //even if pixels aren't deblocked yet | ||||
ff_thread_await_progress((AVFrame*)ref, FFMIN(16*mb_y >> ref_field_picture, ref_height-1), | |||||
ff_thread_await_progress(&ref->f, | |||||
FFMIN(16 * mb_y >> ref_field_picture, ref_height - 1), | |||||
ref_field_picture && ref_field); | ref_field_picture && ref_field); | ||||
} | } | ||||
@@ -143,7 +143,7 @@ static int ir2_decode_frame(AVCodecContext *avctx, | |||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
Ir2Context * const s = avctx->priv_data; | Ir2Context * const s = avctx->priv_data; | ||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
int start; | int start; | ||||
p->reference = 3; | p->reference = 3; | ||||
@@ -188,7 +188,7 @@ static int ir2_decode_frame(AVCodecContext *avctx, | |||||
s->picture.data[1], s->picture.linesize[1], ir2_luma_table); | s->picture.data[1], s->picture.linesize[1], ir2_luma_table); | ||||
} | } | ||||
*picture= *(AVFrame*)&s->picture; | |||||
*picture = s->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
return buf_size; | return buf_size; | ||||
@@ -232,7 +232,7 @@ static int encode_picture_ls(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
JpeglsContext * const s = avctx->priv_data; | JpeglsContext * const s = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
const int near = avctx->prediction_method; | const int near = avctx->prediction_method; | ||||
PutBitContext pb, pb2; | PutBitContext pb, pb2; | ||||
GetBitContext gb; | GetBitContext gb; | ||||
@@ -45,7 +45,7 @@ static int encode_picture_lossless(AVCodecContext *avctx, AVPacket *pkt, | |||||
MJpegContext * const m = s->mjpeg_ctx; | MJpegContext * const m = s->mjpeg_ctx; | ||||
const int width= s->width; | const int width= s->width; | ||||
const int height= s->height; | const int height= s->height; | ||||
AVFrame * const p= (AVFrame*)&s->current_picture; | |||||
AVFrame * const p = &s->current_picture.f; | |||||
const int predictor= avctx->prediction_method+1; | const int predictor= avctx->prediction_method+1; | ||||
const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0]; | const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0]; | ||||
const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0]; | const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0]; | ||||
@@ -166,7 +166,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
LOCOContext * const l = avctx->priv_data; | LOCOContext * const l = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&l->pic; | |||||
AVFrame * const p = &l->pic; | |||||
int decoded; | int decoded; | ||||
if(p->data[0]) | if(p->data[0]) | ||||
@@ -243,7 +243,7 @@ static av_cold int decode_init(AVCodecContext *avctx){ | |||||
static av_cold int decode_init_thread_copy(AVCodecContext *avctx){ | static av_cold int decode_init_thread_copy(AVCodecContext *avctx){ | ||||
MDECContext * const a = avctx->priv_data; | MDECContext * const a = avctx->priv_data; | ||||
AVFrame *p = (AVFrame*)&a->picture; | |||||
AVFrame *p = &a->picture; | |||||
avctx->coded_frame= p; | avctx->coded_frame= p; | ||||
a->avctx= avctx; | a->avctx= avctx; | ||||
@@ -1577,7 +1577,7 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
goto the_end; | goto the_end; | ||||
} else if (unescaped_buf_size > (1U<<29)) { | } else if (unescaped_buf_size > (1U<<29)) { | ||||
av_log(avctx, AV_LOG_ERROR, "MJPEG packet 0x%x too big (0x%x/0x%x), corrupt data?\n", | av_log(avctx, AV_LOG_ERROR, "MJPEG packet 0x%x too big (0x%x/0x%x), corrupt data?\n", | ||||
start_code, unescaped_buf_ptr, buf_size); | |||||
start_code, unescaped_buf_size, buf_size); | |||||
return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
} else { | } else { | ||||
av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", | av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", | ||||
@@ -1952,7 +1952,7 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) | |||||
ff_MPV_frame_end(s); | ff_MPV_frame_end(s); | ||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | ||||
*pict = *(AVFrame*)s->current_picture_ptr; | |||||
*pict = s->current_picture_ptr->f; | |||||
ff_print_debug_info(s, pict); | ff_print_debug_info(s, pict); | ||||
} else { | } else { | ||||
if (avctx->active_thread_type & FF_THREAD_FRAME) | if (avctx->active_thread_type & FF_THREAD_FRAME) | ||||
@@ -1960,7 +1960,7 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) | |||||
/* latency of 1 frame for I- and P-frames */ | /* latency of 1 frame for I- and P-frames */ | ||||
/* XXX: use another variable than picture_number */ | /* XXX: use another variable than picture_number */ | ||||
if (s->last_picture_ptr != NULL) { | if (s->last_picture_ptr != NULL) { | ||||
*pict = *(AVFrame*)s->last_picture_ptr; | |||||
*pict = s->last_picture_ptr->f; | |||||
ff_print_debug_info(s, pict); | ff_print_debug_info(s, pict); | ||||
} | } | ||||
} | } | ||||
@@ -2256,7 +2256,7 @@ static int mpeg_decode_frame(AVCodecContext *avctx, | |||||
if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) { | if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) { | ||||
/* special case for last picture */ | /* special case for last picture */ | ||||
if (s2->low_delay == 0 && s2->next_picture_ptr) { | if (s2->low_delay == 0 && s2->next_picture_ptr) { | ||||
*picture = *(AVFrame*)s2->next_picture_ptr; | |||||
*picture = s2->next_picture_ptr->f; | |||||
s2->next_picture_ptr = NULL; | s2->next_picture_ptr = NULL; | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
@@ -1313,7 +1313,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, | |||||
s->last_mv[i][1][1]= 0; | s->last_mv[i][1][1]= 0; | ||||
} | } | ||||
ff_thread_await_progress((AVFrame*)s->next_picture_ptr, s->mb_y, 0); | |||||
ff_thread_await_progress(&s->next_picture_ptr->f, s->mb_y, 0); | |||||
} | } | ||||
/* if we skipped it in the future P Frame than skip it now too */ | /* if we skipped it in the future P Frame than skip it now too */ | ||||
@@ -1500,7 +1500,7 @@ end: | |||||
if(s->pict_type==AV_PICTURE_TYPE_B){ | if(s->pict_type==AV_PICTURE_TYPE_B){ | ||||
const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; | const int delta= s->mb_x + 1 == s->mb_width ? 2 : 1; | ||||
ff_thread_await_progress((AVFrame*)s->next_picture_ptr, | |||||
ff_thread_await_progress(&s->next_picture_ptr->f, | |||||
(s->mb_x + delta >= s->mb_width) ? FFMIN(s->mb_y+1, s->mb_height-1) : s->mb_y, 0); | (s->mb_x + delta >= s->mb_width) ? FFMIN(s->mb_y+1, s->mb_height-1) : s->mb_y, 0); | ||||
if (s->next_picture.f.mbskip_table[xy + delta]) | if (s->next_picture.f.mbskip_table[xy + delta]) | ||||
return SLICE_OK; | return SLICE_OK; | ||||
@@ -232,9 +232,9 @@ static void free_frame_buffer(MpegEncContext *s, Picture *pic) | |||||
* dimensions; ignore user defined callbacks for these | * dimensions; ignore user defined callbacks for these | ||||
*/ | */ | ||||
if (s->codec_id != CODEC_ID_WMV3IMAGE && s->codec_id != CODEC_ID_VC1IMAGE) | if (s->codec_id != CODEC_ID_WMV3IMAGE && s->codec_id != CODEC_ID_VC1IMAGE) | ||||
ff_thread_release_buffer(s->avctx, (AVFrame *) pic); | |||||
ff_thread_release_buffer(s->avctx, &pic->f); | |||||
else | else | ||||
avcodec_default_release_buffer(s->avctx, (AVFrame *) pic); | |||||
avcodec_default_release_buffer(s->avctx, &pic->f); | |||||
av_freep(&pic->f.hwaccel_picture_private); | av_freep(&pic->f.hwaccel_picture_private); | ||||
} | } | ||||
@@ -257,9 +257,9 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) | |||||
} | } | ||||
if (s->codec_id != CODEC_ID_WMV3IMAGE && s->codec_id != CODEC_ID_VC1IMAGE) | if (s->codec_id != CODEC_ID_WMV3IMAGE && s->codec_id != CODEC_ID_VC1IMAGE) | ||||
r = ff_thread_get_buffer(s->avctx, (AVFrame *) pic); | |||||
r = ff_thread_get_buffer(s->avctx, &pic->f); | |||||
else | else | ||||
r = avcodec_default_get_buffer(s->avctx, (AVFrame *) pic); | |||||
r = avcodec_default_get_buffer(s->avctx, &pic->f); | |||||
if (r < 0 || !pic->f.type || !pic->f.data[0]) { | if (r < 0 || !pic->f.type || !pic->f.data[0]) { | ||||
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n", | av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n", | ||||
@@ -729,7 +729,7 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) | |||||
s->codec_tag = avpriv_toupper4(s->avctx->codec_tag); | s->codec_tag = avpriv_toupper4(s->avctx->codec_tag); | ||||
s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag); | s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag); | ||||
s->avctx->coded_frame = (AVFrame*)&s->current_picture; | |||||
s->avctx->coded_frame = &s->current_picture.f; | |||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this | FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this | ||||
for (y = 0; y < s->mb_height; y++) | for (y = 0; y < s->mb_height; y++) | ||||
@@ -781,7 +781,7 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) | |||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, | FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, | ||||
s->picture_count * sizeof(Picture), fail); | s->picture_count * sizeof(Picture), fail); | ||||
for (i = 0; i < s->picture_count; i++) { | for (i = 0; i < s->picture_count; i++) { | ||||
avcodec_get_frame_defaults((AVFrame *) &s->picture[i]); | |||||
avcodec_get_frame_defaults(&s->picture[i].f); | |||||
} | } | ||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail) | FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail) | ||||
@@ -1247,10 +1247,8 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) | |||||
memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width); | memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width); | ||||
} | } | ||||
ff_thread_report_progress((AVFrame *) s->last_picture_ptr, | |||||
INT_MAX, 0); | |||||
ff_thread_report_progress((AVFrame *) s->last_picture_ptr, | |||||
INT_MAX, 1); | |||||
ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0); | |||||
ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1); | |||||
} | } | ||||
if ((s->next_picture_ptr == NULL || | if ((s->next_picture_ptr == NULL || | ||||
s->next_picture_ptr->f.data[0] == NULL) && | s->next_picture_ptr->f.data[0] == NULL) && | ||||
@@ -1263,10 +1261,8 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) | |||||
s->next_picture_ptr->f.key_frame = 0; | s->next_picture_ptr->f.key_frame = 0; | ||||
if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) | if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) | ||||
return -1; | return -1; | ||||
ff_thread_report_progress((AVFrame *) s->next_picture_ptr, | |||||
INT_MAX, 0); | |||||
ff_thread_report_progress((AVFrame *) s->next_picture_ptr, | |||||
INT_MAX, 1); | |||||
ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 0); | |||||
ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 1); | |||||
} | } | ||||
} | } | ||||
@@ -1391,10 +1387,10 @@ void ff_MPV_frame_end(MpegEncContext *s) | |||||
memset(&s->next_picture, 0, sizeof(Picture)); | memset(&s->next_picture, 0, sizeof(Picture)); | ||||
memset(&s->current_picture, 0, sizeof(Picture)); | memset(&s->current_picture, 0, sizeof(Picture)); | ||||
#endif | #endif | ||||
s->avctx->coded_frame = (AVFrame *) s->current_picture_ptr; | |||||
s->avctx->coded_frame = &s->current_picture_ptr->f; | |||||
if (s->codec_id != CODEC_ID_H264 && s->current_picture.f.reference) { | if (s->codec_id != CODEC_ID_H264 && s->current_picture.f.reference) { | ||||
ff_thread_report_progress((AVFrame *) s->current_picture_ptr, | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, | |||||
s->mb_height - 1, 0); | s->mb_height - 1, 0); | ||||
} | } | ||||
} | } | ||||
@@ -2346,10 +2342,14 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], | |||||
if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) { | if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) { | ||||
if (s->mv_dir & MV_DIR_FORWARD) { | if (s->mv_dir & MV_DIR_FORWARD) { | ||||
ff_thread_await_progress((AVFrame*)s->last_picture_ptr, ff_MPV_lowest_referenced_row(s, 0), 0); | |||||
ff_thread_await_progress(&s->last_picture_ptr->f, | |||||
ff_MPV_lowest_referenced_row(s, 0), | |||||
0); | |||||
} | } | ||||
if (s->mv_dir & MV_DIR_BACKWARD) { | if (s->mv_dir & MV_DIR_BACKWARD) { | ||||
ff_thread_await_progress((AVFrame*)s->next_picture_ptr, ff_MPV_lowest_referenced_row(s, 1), 0); | |||||
ff_thread_await_progress(&s->next_picture_ptr->f, | |||||
ff_MPV_lowest_referenced_row(s, 1), | |||||
0); | |||||
} | } | ||||
} | } | ||||
@@ -2556,9 +2556,9 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){ | |||||
int i; | int i; | ||||
if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER)) | if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER)) | ||||
src= (AVFrame*)s->current_picture_ptr; | |||||
src = &s->current_picture_ptr->f; | |||||
else if(s->last_picture_ptr) | else if(s->last_picture_ptr) | ||||
src= (AVFrame*)s->last_picture_ptr; | |||||
src = &s->last_picture_ptr->f; | |||||
else | else | ||||
return; | return; | ||||
@@ -2867,5 +2867,5 @@ void ff_set_qscale(MpegEncContext * s, int qscale) | |||||
void ff_MPV_report_decode_progress(MpegEncContext *s) | void ff_MPV_report_decode_progress(MpegEncContext *s) | ||||
{ | { | ||||
if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred) | if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred) | ||||
ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0); | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, s->mb_y, 0); | |||||
} | } |
@@ -981,7 +981,7 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg) | |||||
if (i < 0) | if (i < 0) | ||||
return i; | return i; | ||||
pic = (AVFrame *) &s->picture[i]; | |||||
pic = &s->picture[i].f; | |||||
pic->reference = 3; | pic->reference = 3; | ||||
for (i = 0; i < 4; i++) { | for (i = 0; i < 4; i++) { | ||||
@@ -996,7 +996,7 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg) | |||||
if (i < 0) | if (i < 0) | ||||
return i; | return i; | ||||
pic = (AVFrame *) &s->picture[i]; | |||||
pic = &s->picture[i].f; | |||||
pic->reference = 3; | pic->reference = 3; | ||||
if (ff_alloc_picture(s, (Picture *) pic, 0) < 0) { | if (ff_alloc_picture(s, (Picture *) pic, 0) < 0) { | ||||
@@ -1252,7 +1252,7 @@ static int select_input_picture(MpegEncContext *s) | |||||
s->input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL); | s->input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL); | ||||
s->avctx->release_buffer(s->avctx, | s->avctx->release_buffer(s->avctx, | ||||
(AVFrame *) s->input_picture[0]); | |||||
&s->input_picture[0]->f); | |||||
} | } | ||||
emms_c(); | emms_c(); | ||||
@@ -1385,13 +1385,13 @@ no_output_pic: | |||||
/* mark us unused / free shared pic */ | /* mark us unused / free shared pic */ | ||||
if (s->reordered_input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL) | if (s->reordered_input_picture[0]->f.type == FF_BUFFER_TYPE_INTERNAL) | ||||
s->avctx->release_buffer(s->avctx, | s->avctx->release_buffer(s->avctx, | ||||
(AVFrame *) s->reordered_input_picture[0]); | |||||
&s->reordered_input_picture[0]->f); | |||||
for (i = 0; i < 4; i++) | for (i = 0; i < 4; i++) | ||||
s->reordered_input_picture[0]->f.data[i] = NULL; | s->reordered_input_picture[0]->f.data[i] = NULL; | ||||
s->reordered_input_picture[0]->f.type = 0; | s->reordered_input_picture[0]->f.type = 0; | ||||
copy_picture_attributes(s, (AVFrame *) pic, | |||||
(AVFrame *) s->reordered_input_picture[0]); | |||||
copy_picture_attributes(s, &pic->f, | |||||
&s->reordered_input_picture[0]->f); | |||||
s->current_picture_ptr = pic; | s->current_picture_ptr = pic; | ||||
} else { | } else { | ||||
@@ -34,6 +34,7 @@ | |||||
#include "libavutil/x86_cpu.h" | #include "libavutil/x86_cpu.h" | ||||
#include "h263.h" | #include "h263.h" | ||||
#include "mpeg4video.h" | #include "mpeg4video.h" | ||||
#include "msmpeg4data.h" | |||||
#include "vc1data.h" | #include "vc1data.h" | ||||
/* | /* | ||||
@@ -52,22 +53,8 @@ | |||||
#define V2_MV_VLC_BITS 9 | #define V2_MV_VLC_BITS 9 | ||||
#define TEX_VLC_BITS 9 | #define TEX_VLC_BITS 9 | ||||
#define II_BITRATE 128*1024 | |||||
#define MBAC_BITRATE 50*1024 | |||||
#define DEFAULT_INTER_INDEX 3 | #define DEFAULT_INTER_INDEX 3 | ||||
static uint32_t v2_dc_lum_table[512][2]; | |||||
static uint32_t v2_dc_chroma_table[512][2]; | |||||
#include "msmpeg4data.h" | |||||
#if CONFIG_ENCODERS //strangely gcc includes this even if it is not referenced | |||||
static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; | |||||
#endif //CONFIG_ENCODERS | |||||
static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 3]; | |||||
/* This table is practically identical to the one from h263 | /* This table is practically identical to the one from h263 | ||||
* except that it is inverted. */ | * except that it is inverted. */ | ||||
static av_cold void init_h263_dc_for_msmpeg4(void) | static av_cold void init_h263_dc_for_msmpeg4(void) | ||||
@@ -102,8 +89,8 @@ static av_cold void init_h263_dc_for_msmpeg4(void) | |||||
uni_len++; | uni_len++; | ||||
} | } | ||||
} | } | ||||
v2_dc_lum_table[level+256][0]= uni_code; | |||||
v2_dc_lum_table[level+256][1]= uni_len; | |||||
ff_v2_dc_lum_table[level + 256][0] = uni_code; | |||||
ff_v2_dc_lum_table[level + 256][1] = uni_len; | |||||
/* chrominance h263 */ | /* chrominance h263 */ | ||||
uni_code= ff_mpeg4_DCtab_chrom[size][0]; | uni_code= ff_mpeg4_DCtab_chrom[size][0]; | ||||
@@ -118,13 +105,13 @@ static av_cold void init_h263_dc_for_msmpeg4(void) | |||||
uni_len++; | uni_len++; | ||||
} | } | ||||
} | } | ||||
v2_dc_chroma_table[level+256][0]= uni_code; | |||||
v2_dc_chroma_table[level+256][1]= uni_len; | |||||
ff_v2_dc_chroma_table[level + 256][0] = uni_code; | |||||
ff_v2_dc_chroma_table[level + 256][1] = uni_len; | |||||
} | } | ||||
} | } | ||||
static av_cold void common_init(MpegEncContext * s) | |||||
av_cold void ff_msmpeg4_common_init(MpegEncContext *s) | |||||
{ | { | ||||
static int initialized=0; | static int initialized=0; | ||||
@@ -173,251 +160,6 @@ static av_cold void common_init(MpegEncContext * s) | |||||
} | } | ||||
} | } | ||||
#if CONFIG_ENCODERS | |||||
/* build the table which associate a (x,y) motion vector to a vlc */ | |||||
static void init_mv_table(MVTable *tab) | |||||
{ | |||||
int i, x, y; | |||||
tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096); | |||||
/* mark all entries as not used */ | |||||
for(i=0;i<4096;i++) | |||||
tab->table_mv_index[i] = tab->n; | |||||
for(i=0;i<tab->n;i++) { | |||||
x = tab->table_mvx[i]; | |||||
y = tab->table_mvy[i]; | |||||
tab->table_mv_index[(x << 6) | y] = i; | |||||
} | |||||
} | |||||
void ff_msmpeg4_code012(PutBitContext *pb, int n) | |||||
{ | |||||
if (n == 0) { | |||||
put_bits(pb, 1, 0); | |||||
} else { | |||||
put_bits(pb, 1, 1); | |||||
put_bits(pb, 1, (n >= 2)); | |||||
} | |||||
} | |||||
static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){ | |||||
int size=0; | |||||
int code; | |||||
int run_diff= intra ? 0 : 1; | |||||
code = get_rl_index(rl, last, run, level); | |||||
size+= rl->table_vlc[code][1]; | |||||
if (code == rl->n) { | |||||
int level1, run1; | |||||
level1 = level - rl->max_level[last][run]; | |||||
if (level1 < 1) | |||||
goto esc2; | |||||
code = get_rl_index(rl, last, run, level1); | |||||
if (code == rl->n) { | |||||
esc2: | |||||
size++; | |||||
if (level > MAX_LEVEL) | |||||
goto esc3; | |||||
run1 = run - rl->max_run[last][level] - run_diff; | |||||
if (run1 < 0) | |||||
goto esc3; | |||||
code = get_rl_index(rl, last, run1, level); | |||||
if (code == rl->n) { | |||||
esc3: | |||||
/* third escape */ | |||||
size+=1+1+6+8; | |||||
} else { | |||||
/* second escape */ | |||||
size+= 1+1+ rl->table_vlc[code][1]; | |||||
} | |||||
} else { | |||||
/* first escape */ | |||||
size+= 1+1+ rl->table_vlc[code][1]; | |||||
} | |||||
} else { | |||||
size++; | |||||
} | |||||
return size; | |||||
} | |||||
av_cold void ff_msmpeg4_encode_init(MpegEncContext *s) | |||||
{ | |||||
static int init_done=0; | |||||
int i; | |||||
common_init(s); | |||||
if(s->msmpeg4_version>=4){ | |||||
s->min_qcoeff= -255; | |||||
s->max_qcoeff= 255; | |||||
} | |||||
if (!init_done) { | |||||
/* init various encoding tables */ | |||||
init_done = 1; | |||||
init_mv_table(&ff_mv_tables[0]); | |||||
init_mv_table(&ff_mv_tables[1]); | |||||
for(i=0;i<NB_RL_TABLES;i++) | |||||
ff_init_rl(&ff_rl_table[i], static_rl_table_store[i]); | |||||
for(i=0; i<NB_RL_TABLES; i++){ | |||||
int level; | |||||
for (level = 1; level <= MAX_LEVEL; level++) { | |||||
int run; | |||||
for(run=0; run<=MAX_RUN; run++){ | |||||
int last; | |||||
for(last=0; last<2; last++){ | |||||
rl_length[i][level][run][last]= get_size_of_code(s, &ff_rl_table[ i], last, run, level, 0); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
static void find_best_tables(MpegEncContext * s) | |||||
{ | |||||
int i; | |||||
int best = 0, best_size = INT_MAX; | |||||
int chroma_best = 0, best_chroma_size = INT_MAX; | |||||
for(i=0; i<3; i++){ | |||||
int level; | |||||
int chroma_size=0; | |||||
int size=0; | |||||
if(i>0){// ;) | |||||
size++; | |||||
chroma_size++; | |||||
} | |||||
for(level=0; level<=MAX_LEVEL; level++){ | |||||
int run; | |||||
for(run=0; run<=MAX_RUN; run++){ | |||||
int last; | |||||
const int last_size= size + chroma_size; | |||||
for(last=0; last<2; last++){ | |||||
int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last]; | |||||
int intra_luma_count = s->ac_stats[1][0][level][run][last]; | |||||
int intra_chroma_count= s->ac_stats[1][1][level][run][last]; | |||||
if(s->pict_type==AV_PICTURE_TYPE_I){ | |||||
size += intra_luma_count *rl_length[i ][level][run][last]; | |||||
chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last]; | |||||
}else{ | |||||
size+= intra_luma_count *rl_length[i ][level][run][last] | |||||
+intra_chroma_count*rl_length[i+3][level][run][last] | |||||
+inter_count *rl_length[i+3][level][run][last]; | |||||
} | |||||
} | |||||
if(last_size == size+chroma_size) break; | |||||
} | |||||
} | |||||
if(size<best_size){ | |||||
best_size= size; | |||||
best= i; | |||||
} | |||||
if(chroma_size<best_chroma_size){ | |||||
best_chroma_size= chroma_size; | |||||
chroma_best= i; | |||||
} | |||||
} | |||||
// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n", | |||||
// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size); | |||||
if(s->pict_type==AV_PICTURE_TYPE_P) chroma_best= best; | |||||
memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2); | |||||
s->rl_table_index = best; | |||||
s->rl_chroma_table_index= chroma_best; | |||||
if(s->pict_type != s->last_non_b_pict_type){ | |||||
s->rl_table_index= 2; | |||||
if(s->pict_type==AV_PICTURE_TYPE_I) | |||||
s->rl_chroma_table_index= 1; | |||||
else | |||||
s->rl_chroma_table_index= 2; | |||||
} | |||||
} | |||||
/* write MSMPEG4 compatible frame header */ | |||||
void ff_msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) | |||||
{ | |||||
find_best_tables(s); | |||||
avpriv_align_put_bits(&s->pb); | |||||
put_bits(&s->pb, 2, s->pict_type - 1); | |||||
put_bits(&s->pb, 5, s->qscale); | |||||
if(s->msmpeg4_version<=2){ | |||||
s->rl_table_index = 2; | |||||
s->rl_chroma_table_index = 2; | |||||
} | |||||
s->dc_table_index = 1; | |||||
s->mv_table_index = 1; /* only if P frame */ | |||||
s->use_skip_mb_code = 1; /* only if P frame */ | |||||
s->per_mb_rl_table = 0; | |||||
if(s->msmpeg4_version==4) | |||||
s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==AV_PICTURE_TYPE_P); | |||||
//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height); | |||||
if (s->pict_type == AV_PICTURE_TYPE_I) { | |||||
s->slice_height= s->mb_height/1; | |||||
put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height); | |||||
if(s->msmpeg4_version==4){ | |||||
ff_msmpeg4_encode_ext_header(s); | |||||
if(s->bit_rate>MBAC_BITRATE) | |||||
put_bits(&s->pb, 1, s->per_mb_rl_table); | |||||
} | |||||
if(s->msmpeg4_version>2){ | |||||
if(!s->per_mb_rl_table){ | |||||
ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); | |||||
ff_msmpeg4_code012(&s->pb, s->rl_table_index); | |||||
} | |||||
put_bits(&s->pb, 1, s->dc_table_index); | |||||
} | |||||
} else { | |||||
put_bits(&s->pb, 1, s->use_skip_mb_code); | |||||
if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE) | |||||
put_bits(&s->pb, 1, s->per_mb_rl_table); | |||||
if(s->msmpeg4_version>2){ | |||||
if(!s->per_mb_rl_table) | |||||
ff_msmpeg4_code012(&s->pb, s->rl_table_index); | |||||
put_bits(&s->pb, 1, s->dc_table_index); | |||||
put_bits(&s->pb, 1, s->mv_table_index); | |||||
} | |||||
} | |||||
s->esc3_level_length= 0; | |||||
s->esc3_run_length= 0; | |||||
} | |||||
void ff_msmpeg4_encode_ext_header(MpegEncContext * s) | |||||
{ | |||||
put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29 | |||||
put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047)); | |||||
if(s->msmpeg4_version>=3) | |||||
put_bits(&s->pb, 1, s->flipflop_rounding); | |||||
else | |||||
assert(s->flipflop_rounding==0); | |||||
} | |||||
#endif //CONFIG_ENCODERS | |||||
/* predict coded block */ | /* predict coded block */ | ||||
int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) | int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) | ||||
{ | { | ||||
@@ -445,217 +187,6 @@ int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block | |||||
return pred; | return pred; | ||||
} | } | ||||
#if CONFIG_ENCODERS | |||||
void ff_msmpeg4_encode_motion(MpegEncContext * s, | |||||
int mx, int my) | |||||
{ | |||||
int code; | |||||
MVTable *mv; | |||||
/* modulo encoding */ | |||||
/* WARNING : you cannot reach all the MVs even with the modulo | |||||
encoding. This is a somewhat strange compromise they took !!! */ | |||||
if (mx <= -64) | |||||
mx += 64; | |||||
else if (mx >= 64) | |||||
mx -= 64; | |||||
if (my <= -64) | |||||
my += 64; | |||||
else if (my >= 64) | |||||
my -= 64; | |||||
mx += 32; | |||||
my += 32; | |||||
#if 0 | |||||
if ((unsigned)mx >= 64 || | |||||
(unsigned)my >= 64) | |||||
av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my); | |||||
#endif | |||||
mv = &ff_mv_tables[s->mv_table_index]; | |||||
code = mv->table_mv_index[(mx << 6) | my]; | |||||
put_bits(&s->pb, | |||||
mv->table_mv_bits[code], | |||||
mv->table_mv_code[code]); | |||||
if (code == mv->n) { | |||||
/* escape : code literally */ | |||||
put_bits(&s->pb, 6, mx); | |||||
put_bits(&s->pb, 6, my); | |||||
} | |||||
} | |||||
void ff_msmpeg4_handle_slices(MpegEncContext *s){ | |||||
if (s->mb_x == 0) { | |||||
if (s->slice_height && (s->mb_y % s->slice_height) == 0) { | |||||
if(s->msmpeg4_version < 4){ | |||||
ff_mpeg4_clean_buffers(s); | |||||
} | |||||
s->first_slice_line = 1; | |||||
} else { | |||||
s->first_slice_line = 0; | |||||
} | |||||
} | |||||
} | |||||
static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) | |||||
{ | |||||
int range, bit_size, sign, code, bits; | |||||
if (val == 0) { | |||||
/* zero vector */ | |||||
code = 0; | |||||
put_bits(&s->pb, ff_mvtab[code][1], ff_mvtab[code][0]); | |||||
} else { | |||||
bit_size = s->f_code - 1; | |||||
range = 1 << bit_size; | |||||
if (val <= -64) | |||||
val += 64; | |||||
else if (val >= 64) | |||||
val -= 64; | |||||
if (val >= 0) { | |||||
sign = 0; | |||||
} else { | |||||
val = -val; | |||||
sign = 1; | |||||
} | |||||
val--; | |||||
code = (val >> bit_size) + 1; | |||||
bits = val & (range - 1); | |||||
put_bits(&s->pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign); | |||||
if (bit_size > 0) { | |||||
put_bits(&s->pb, bit_size, bits); | |||||
} | |||||
} | |||||
} | |||||
void ff_msmpeg4_encode_mb(MpegEncContext * s, | |||||
DCTELEM block[6][64], | |||||
int motion_x, int motion_y) | |||||
{ | |||||
int cbp, coded_cbp, i; | |||||
int pred_x, pred_y; | |||||
uint8_t *coded_block; | |||||
ff_msmpeg4_handle_slices(s); | |||||
if (!s->mb_intra) { | |||||
/* compute cbp */ | |||||
cbp = 0; | |||||
for (i = 0; i < 6; i++) { | |||||
if (s->block_last_index[i] >= 0) | |||||
cbp |= 1 << (5 - i); | |||||
} | |||||
if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { | |||||
/* skip macroblock */ | |||||
put_bits(&s->pb, 1, 1); | |||||
s->last_bits++; | |||||
s->misc_bits++; | |||||
s->skip_count++; | |||||
return; | |||||
} | |||||
if (s->use_skip_mb_code) | |||||
put_bits(&s->pb, 1, 0); /* mb coded */ | |||||
if(s->msmpeg4_version<=2){ | |||||
put_bits(&s->pb, | |||||
ff_v2_mb_type[cbp&3][1], | |||||
ff_v2_mb_type[cbp&3][0]); | |||||
if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C; | |||||
else coded_cbp= cbp; | |||||
put_bits(&s->pb, | |||||
ff_h263_cbpy_tab[coded_cbp>>2][1], | |||||
ff_h263_cbpy_tab[coded_cbp>>2][0]); | |||||
s->misc_bits += get_bits_diff(s); | |||||
ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); | |||||
msmpeg4v2_encode_motion(s, motion_x - pred_x); | |||||
msmpeg4v2_encode_motion(s, motion_y - pred_y); | |||||
}else{ | |||||
put_bits(&s->pb, | |||||
ff_table_mb_non_intra[cbp + 64][1], | |||||
ff_table_mb_non_intra[cbp + 64][0]); | |||||
s->misc_bits += get_bits_diff(s); | |||||
/* motion vector */ | |||||
ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); | |||||
ff_msmpeg4_encode_motion(s, motion_x - pred_x, | |||||
motion_y - pred_y); | |||||
} | |||||
s->mv_bits += get_bits_diff(s); | |||||
for (i = 0; i < 6; i++) { | |||||
ff_msmpeg4_encode_block(s, block[i], i); | |||||
} | |||||
s->p_tex_bits += get_bits_diff(s); | |||||
} else { | |||||
/* compute cbp */ | |||||
cbp = 0; | |||||
coded_cbp = 0; | |||||
for (i = 0; i < 6; i++) { | |||||
int val, pred; | |||||
val = (s->block_last_index[i] >= 1); | |||||
cbp |= val << (5 - i); | |||||
if (i < 4) { | |||||
/* predict value for close blocks only for luma */ | |||||
pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); | |||||
*coded_block = val; | |||||
val = val ^ pred; | |||||
} | |||||
coded_cbp |= val << (5 - i); | |||||
} | |||||
if(s->msmpeg4_version<=2){ | |||||
if (s->pict_type == AV_PICTURE_TYPE_I) { | |||||
put_bits(&s->pb, | |||||
ff_v2_intra_cbpc[cbp&3][1], ff_v2_intra_cbpc[cbp&3][0]); | |||||
} else { | |||||
if (s->use_skip_mb_code) | |||||
put_bits(&s->pb, 1, 0); /* mb coded */ | |||||
put_bits(&s->pb, | |||||
ff_v2_mb_type[(cbp&3) + 4][1], | |||||
ff_v2_mb_type[(cbp&3) + 4][0]); | |||||
} | |||||
put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | |||||
put_bits(&s->pb, | |||||
ff_h263_cbpy_tab[cbp>>2][1], | |||||
ff_h263_cbpy_tab[cbp>>2][0]); | |||||
}else{ | |||||
if (s->pict_type == AV_PICTURE_TYPE_I) { | |||||
put_bits(&s->pb, | |||||
ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); | |||||
} else { | |||||
if (s->use_skip_mb_code) | |||||
put_bits(&s->pb, 1, 0); /* mb coded */ | |||||
put_bits(&s->pb, | |||||
ff_table_mb_non_intra[cbp][1], | |||||
ff_table_mb_non_intra[cbp][0]); | |||||
} | |||||
put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | |||||
if(s->inter_intra_pred){ | |||||
s->h263_aic_dir=0; | |||||
put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]); | |||||
} | |||||
} | |||||
s->misc_bits += get_bits_diff(s); | |||||
for (i = 0; i < 6; i++) { | |||||
ff_msmpeg4_encode_block(s, block[i], i); | |||||
} | |||||
s->i_tex_bits += get_bits_diff(s); | |||||
s->i_count++; | |||||
} | |||||
} | |||||
#endif //CONFIG_ENCODERS | |||||
static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n, | static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n, | ||||
int32_t **dc_val_ptr) | int32_t **dc_val_ptr) | ||||
{ | { | ||||
@@ -685,8 +216,8 @@ static int get_dc(uint8_t *src, int stride, int scale) | |||||
} | } | ||||
/* dir = 0: left, dir = 1: top prediction */ | /* dir = 0: left, dir = 1: top prediction */ | ||||
static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, | |||||
int16_t **dc_val_ptr, int *dir_ptr) | |||||
int ff_msmpeg4_pred_dc(MpegEncContext *s, int n, | |||||
int16_t **dc_val_ptr, int *dir_ptr) | |||||
{ | { | ||||
int a, b, c, wrap, pred, scale; | int a, b, c, wrap, pred, scale; | ||||
int16_t *dc_val; | int16_t *dc_val; | ||||
@@ -832,207 +363,6 @@ static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, | |||||
return pred; | return pred; | ||||
} | } | ||||
#define DC_MAX 119 | |||||
static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) | |||||
{ | |||||
int sign, code; | |||||
int pred, extquant; | |||||
int extrabits = 0; | |||||
int16_t *dc_val; | |||||
pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); | |||||
/* update predictor */ | |||||
if (n < 4) { | |||||
*dc_val = level * s->y_dc_scale; | |||||
} else { | |||||
*dc_val = level * s->c_dc_scale; | |||||
} | |||||
/* do the prediction */ | |||||
level -= pred; | |||||
if(s->msmpeg4_version<=2){ | |||||
if (n < 4) { | |||||
put_bits(&s->pb, | |||||
v2_dc_lum_table[level+256][1], | |||||
v2_dc_lum_table[level+256][0]); | |||||
}else{ | |||||
put_bits(&s->pb, | |||||
v2_dc_chroma_table[level+256][1], | |||||
v2_dc_chroma_table[level+256][0]); | |||||
} | |||||
}else{ | |||||
sign = 0; | |||||
if (level < 0) { | |||||
level = -level; | |||||
sign = 1; | |||||
} | |||||
code = level; | |||||
if (code > DC_MAX) | |||||
code = DC_MAX; | |||||
else if( s->msmpeg4_version>=6 ) { | |||||
if( s->qscale == 1 ) { | |||||
extquant = (level + 3) & 0x3; | |||||
code = ((level+3)>>2); | |||||
} else if( s->qscale == 2 ) { | |||||
extquant = (level + 1) & 0x1; | |||||
code = ((level+1)>>1); | |||||
} | |||||
} | |||||
if (s->dc_table_index == 0) { | |||||
if (n < 4) { | |||||
put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]); | |||||
} else { | |||||
put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]); | |||||
} | |||||
} else { | |||||
if (n < 4) { | |||||
put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]); | |||||
} else { | |||||
put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]); | |||||
} | |||||
} | |||||
if(s->msmpeg4_version>=6 && s->qscale<=2) | |||||
extrabits = 3 - s->qscale; | |||||
if (code == DC_MAX) | |||||
put_bits(&s->pb, 8 + extrabits, level); | |||||
else if(extrabits > 0)//== VC1 && s->qscale<=2 | |||||
put_bits(&s->pb, extrabits, extquant); | |||||
if (level != 0) { | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
} | |||||
} | |||||
/* Encoding of a block. Very similar to MPEG4 except for a different | |||||
escape coding (same as H263) and more vlc tables. | |||||
*/ | |||||
void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n) | |||||
{ | |||||
int level, run, last, i, j, last_index; | |||||
int last_non_zero, sign, slevel; | |||||
int code, run_diff, dc_pred_dir; | |||||
const RLTable *rl; | |||||
const uint8_t *scantable; | |||||
if (s->mb_intra) { | |||||
msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir); | |||||
i = 1; | |||||
if (n < 4) { | |||||
rl = &ff_rl_table[s->rl_table_index]; | |||||
} else { | |||||
rl = &ff_rl_table[3 + s->rl_chroma_table_index]; | |||||
} | |||||
run_diff = s->msmpeg4_version>=4; | |||||
scantable= s->intra_scantable.permutated; | |||||
} else { | |||||
i = 0; | |||||
rl = &ff_rl_table[3 + s->rl_table_index]; | |||||
if(s->msmpeg4_version<=2) | |||||
run_diff = 0; | |||||
else | |||||
run_diff = 1; | |||||
scantable= s->inter_scantable.permutated; | |||||
} | |||||
/* recalculate block_last_index for M$ wmv1 */ | |||||
if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){ | |||||
for(last_index=63; last_index>=0; last_index--){ | |||||
if(block[scantable[last_index]]) break; | |||||
} | |||||
s->block_last_index[n]= last_index; | |||||
}else | |||||
last_index = s->block_last_index[n]; | |||||
/* AC coefs */ | |||||
last_non_zero = i - 1; | |||||
for (; i <= last_index; i++) { | |||||
j = scantable[i]; | |||||
level = block[j]; | |||||
if (level) { | |||||
run = i - last_non_zero - 1; | |||||
last = (i == last_index); | |||||
sign = 0; | |||||
slevel = level; | |||||
if (level < 0) { | |||||
sign = 1; | |||||
level = -level; | |||||
} | |||||
if(level<=MAX_LEVEL && run<=MAX_RUN){ | |||||
s->ac_stats[s->mb_intra][n>3][level][run][last]++; | |||||
} | |||||
s->ac_stats[s->mb_intra][n > 3][40][63][0]++; //esc3 like | |||||
code = get_rl_index(rl, last, run, level); | |||||
put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |||||
if (code == rl->n) { | |||||
int level1, run1; | |||||
level1 = level - rl->max_level[last][run]; | |||||
if (level1 < 1) | |||||
goto esc2; | |||||
code = get_rl_index(rl, last, run, level1); | |||||
if (code == rl->n) { | |||||
esc2: | |||||
put_bits(&s->pb, 1, 0); | |||||
if (level > MAX_LEVEL) | |||||
goto esc3; | |||||
run1 = run - rl->max_run[last][level] - run_diff; | |||||
if (run1 < 0) | |||||
goto esc3; | |||||
code = get_rl_index(rl, last, run1+1, level); | |||||
if (s->msmpeg4_version == 4 && code == rl->n) | |||||
goto esc3; | |||||
code = get_rl_index(rl, last, run1, level); | |||||
if (code == rl->n) { | |||||
esc3: | |||||
/* third escape */ | |||||
put_bits(&s->pb, 1, 0); | |||||
put_bits(&s->pb, 1, last); | |||||
if(s->msmpeg4_version>=4){ | |||||
if(s->esc3_level_length==0){ | |||||
s->esc3_level_length=8; | |||||
s->esc3_run_length= 6; | |||||
//ESCLVLSZ + ESCRUNSZ | |||||
if(s->qscale<8) | |||||
put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3); | |||||
else | |||||
put_bits(&s->pb, 8, 3); | |||||
} | |||||
put_bits(&s->pb, s->esc3_run_length, run); | |||||
put_bits(&s->pb, 1, sign); | |||||
put_bits(&s->pb, s->esc3_level_length, level); | |||||
}else{ | |||||
put_bits(&s->pb, 6, run); | |||||
put_sbits(&s->pb, 8, slevel); | |||||
} | |||||
} else { | |||||
/* second escape */ | |||||
put_bits(&s->pb, 1, 1); | |||||
put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
} else { | |||||
/* first escape */ | |||||
put_bits(&s->pb, 1, 1); | |||||
put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
} else { | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
last_non_zero = i; | |||||
} | |||||
} | |||||
} | |||||
/****************************************/ | /****************************************/ | ||||
/* decoding stuff */ | /* decoding stuff */ | ||||
@@ -1263,13 +593,13 @@ av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx) | |||||
if (ff_h263_decode_init(avctx) < 0) | if (ff_h263_decode_init(avctx) < 0) | ||||
return -1; | return -1; | ||||
common_init(s); | |||||
ff_msmpeg4_common_init(s); | |||||
if (!done) { | if (!done) { | ||||
done = 1; | done = 1; | ||||
for(i=0;i<NB_RL_TABLES;i++) { | for(i=0;i<NB_RL_TABLES;i++) { | ||||
ff_init_rl(&ff_rl_table[i], static_rl_table_store[i]); | |||||
ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]); | |||||
} | } | ||||
INIT_VLC_RL(ff_rl_table[0], 642); | INIT_VLC_RL(ff_rl_table[0], 642); | ||||
INIT_VLC_RL(ff_rl_table[1], 1104); | INIT_VLC_RL(ff_rl_table[1], 1104); | ||||
@@ -1301,11 +631,11 @@ av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx) | |||||
&ff_table1_dc_chroma[0][0], 8, 4, 1216); | &ff_table1_dc_chroma[0][0], 8, 4, 1216); | ||||
INIT_VLC_STATIC(&v2_dc_lum_vlc, DC_VLC_BITS, 512, | INIT_VLC_STATIC(&v2_dc_lum_vlc, DC_VLC_BITS, 512, | ||||
&v2_dc_lum_table[0][1], 8, 4, | |||||
&v2_dc_lum_table[0][0], 8, 4, 1472); | |||||
&ff_v2_dc_lum_table[0][1], 8, 4, | |||||
&ff_v2_dc_lum_table[0][0], 8, 4, 1472); | |||||
INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512, | INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512, | ||||
&v2_dc_chroma_table[0][1], 8, 4, | |||||
&v2_dc_chroma_table[0][0], 8, 4, 1506); | |||||
&ff_v2_dc_chroma_table[0][1], 8, 4, | |||||
&ff_v2_dc_chroma_table[0][0], 8, 4, 1506); | |||||
INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4, | INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4, | ||||
&ff_v2_intra_cbpc[0][1], 2, 1, | &ff_v2_intra_cbpc[0][1], 2, 1, | ||||
@@ -1588,7 +918,7 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) | |||||
*dc_val= level; | *dc_val= level; | ||||
}else{ | }else{ | ||||
int16_t *dc_val; | int16_t *dc_val; | ||||
pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); | |||||
pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); | |||||
level += pred; | level += pred; | ||||
/* update predictor */ | /* update predictor */ | ||||
@@ -22,19 +22,29 @@ | |||||
#ifndef AVCODEC_MSMPEG4_H | #ifndef AVCODEC_MSMPEG4_H | ||||
#define AVCODEC_MSMPEG4_H | #define AVCODEC_MSMPEG4_H | ||||
#include <stdint.h> | |||||
#include "config.h" | #include "config.h" | ||||
#include "avcodec.h" | #include "avcodec.h" | ||||
#include "dsputil.h" | #include "dsputil.h" | ||||
#include "mpegvideo.h" | #include "mpegvideo.h" | ||||
#include "msmpeg4data.h" | |||||
#include "put_bits.h" | |||||
#define INTER_INTRA_VLC_BITS 3 | #define INTER_INTRA_VLC_BITS 3 | ||||
#define MB_NON_INTRA_VLC_BITS 9 | #define MB_NON_INTRA_VLC_BITS 9 | ||||
#define MB_INTRA_VLC_BITS 9 | #define MB_INTRA_VLC_BITS 9 | ||||
#define II_BITRATE 128*1024 | |||||
#define MBAC_BITRATE 50*1024 | |||||
#define DC_MAX 119 | |||||
extern VLC ff_mb_non_intra_vlc[4]; | extern VLC ff_mb_non_intra_vlc[4]; | ||||
extern VLC ff_inter_intra_vlc; | extern VLC ff_inter_intra_vlc; | ||||
void ff_msmpeg4_code012(PutBitContext *pb, int n); | void ff_msmpeg4_code012(PutBitContext *pb, int n); | ||||
void ff_msmpeg4_common_init(MpegEncContext *s); | |||||
void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); | void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); | ||||
void ff_msmpeg4_handle_slices(MpegEncContext *s); | void ff_msmpeg4_handle_slices(MpegEncContext *s); | ||||
void ff_msmpeg4_encode_motion(MpegEncContext * s, int mx, int my); | void ff_msmpeg4_encode_motion(MpegEncContext * s, int mx, int my); | ||||
@@ -43,6 +53,8 @@ int ff_msmpeg4_coded_block_pred(MpegEncContext * s, int n, | |||||
int ff_msmpeg4_decode_motion(MpegEncContext * s, int *mx_ptr, int *my_ptr); | int ff_msmpeg4_decode_motion(MpegEncContext * s, int *mx_ptr, int *my_ptr); | ||||
int ff_msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | int ff_msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, | ||||
int n, int coded, const uint8_t *scan_table); | int n, int coded, const uint8_t *scan_table); | ||||
int ff_msmpeg4_pred_dc(MpegEncContext *s, int n, | |||||
int16_t **dc_val_ptr, int *dir_ptr); | |||||
int ff_wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); | int ff_wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); | ||||
#define CONFIG_MSMPEG4_DECODER (CONFIG_MSMPEG4V1_DECODER || \ | #define CONFIG_MSMPEG4_DECODER (CONFIG_MSMPEG4V1_DECODER || \ | ||||
@@ -29,6 +29,10 @@ | |||||
#include "msmpeg4data.h" | #include "msmpeg4data.h" | ||||
uint32_t ff_v2_dc_lum_table[512][2]; | |||||
uint32_t ff_v2_dc_chroma_table[512][2]; | |||||
uint8_t ff_static_rl_table_store[NB_RL_TABLES][2][2 * MAX_RUN + MAX_LEVEL + 3]; | |||||
VLC ff_msmp4_mb_i_vlc; | VLC ff_msmp4_mb_i_vlc; | ||||
VLC ff_msmp4_dc_luma_vlc[2]; | VLC ff_msmp4_dc_luma_vlc[2]; | ||||
VLC ff_msmp4_dc_chroma_vlc[2]; | VLC ff_msmp4_dc_chroma_vlc[2]; | ||||
@@ -59,6 +59,10 @@ extern const uint8_t ff_wmv1_scantable[WMV1_SCANTABLE_COUNT][64]; | |||||
#define NB_RL_TABLES 6 | #define NB_RL_TABLES 6 | ||||
extern RLTable ff_rl_table[NB_RL_TABLES]; | extern RLTable ff_rl_table[NB_RL_TABLES]; | ||||
extern uint8_t ff_static_rl_table_store[NB_RL_TABLES][2][2 * MAX_RUN + MAX_LEVEL + 3]; | |||||
extern uint32_t ff_v2_dc_lum_table[512][2]; | |||||
extern uint32_t ff_v2_dc_chroma_table[512][2]; | |||||
extern const uint8_t ff_wmv1_y_dc_scale_table[32]; | extern const uint8_t ff_wmv1_y_dc_scale_table[32]; | ||||
extern const uint8_t ff_wmv1_c_dc_scale_table[32]; | extern const uint8_t ff_wmv1_c_dc_scale_table[32]; | ||||
@@ -0,0 +1,692 @@ | |||||
/* | |||||
* MSMPEG4 encoder backend | |||||
* Copyright (c) 2001 Fabrice Bellard | |||||
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | |||||
* | |||||
* msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at> | |||||
* | |||||
* This file is part of FFmpeg. | |||||
* | |||||
* FFmpeg is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 2.1 of the License, or (at your option) any later version. | |||||
* | |||||
* FFmpeg is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public | |||||
* License along with FFmpeg; if not, write to the Free Software | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
/** | |||||
* @file | |||||
* MSMPEG4 encoder backend | |||||
*/ | |||||
#include <stdint.h> | |||||
#include <string.h> | |||||
#include "libavutil/avutil.h" | |||||
#include "libavutil/mem.h" | |||||
#include "mpegvideo.h" | |||||
#include "msmpeg4.h" | |||||
#include "h263.h" | |||||
#include "mpeg4video.h" | |||||
#include "msmpeg4.h" | |||||
#include "msmpeg4data.h" | |||||
#include "put_bits.h" | |||||
#include "rl.h" | |||||
#include "vc1data.h" | |||||
static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; | |||||
/* build the table which associate a (x,y) motion vector to a vlc */ | |||||
static void init_mv_table(MVTable *tab) | |||||
{ | |||||
int i, x, y; | |||||
tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096); | |||||
/* mark all entries as not used */ | |||||
for(i=0;i<4096;i++) | |||||
tab->table_mv_index[i] = tab->n; | |||||
for(i=0;i<tab->n;i++) { | |||||
x = tab->table_mvx[i]; | |||||
y = tab->table_mvy[i]; | |||||
tab->table_mv_index[(x << 6) | y] = i; | |||||
} | |||||
} | |||||
void ff_msmpeg4_code012(PutBitContext *pb, int n) | |||||
{ | |||||
if (n == 0) { | |||||
put_bits(pb, 1, 0); | |||||
} else { | |||||
put_bits(pb, 1, 1); | |||||
put_bits(pb, 1, (n >= 2)); | |||||
} | |||||
} | |||||
static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){ | |||||
int size=0; | |||||
int code; | |||||
int run_diff= intra ? 0 : 1; | |||||
code = get_rl_index(rl, last, run, level); | |||||
size+= rl->table_vlc[code][1]; | |||||
if (code == rl->n) { | |||||
int level1, run1; | |||||
level1 = level - rl->max_level[last][run]; | |||||
if (level1 < 1) | |||||
goto esc2; | |||||
code = get_rl_index(rl, last, run, level1); | |||||
if (code == rl->n) { | |||||
esc2: | |||||
size++; | |||||
if (level > MAX_LEVEL) | |||||
goto esc3; | |||||
run1 = run - rl->max_run[last][level] - run_diff; | |||||
if (run1 < 0) | |||||
goto esc3; | |||||
code = get_rl_index(rl, last, run1, level); | |||||
if (code == rl->n) { | |||||
esc3: | |||||
/* third escape */ | |||||
size+=1+1+6+8; | |||||
} else { | |||||
/* second escape */ | |||||
size+= 1+1+ rl->table_vlc[code][1]; | |||||
} | |||||
} else { | |||||
/* first escape */ | |||||
size+= 1+1+ rl->table_vlc[code][1]; | |||||
} | |||||
} else { | |||||
size++; | |||||
} | |||||
return size; | |||||
} | |||||
av_cold void ff_msmpeg4_encode_init(MpegEncContext *s) | |||||
{ | |||||
static int init_done=0; | |||||
int i; | |||||
ff_msmpeg4_common_init(s); | |||||
if(s->msmpeg4_version>=4){ | |||||
s->min_qcoeff= -255; | |||||
s->max_qcoeff= 255; | |||||
} | |||||
if (!init_done) { | |||||
/* init various encoding tables */ | |||||
init_done = 1; | |||||
init_mv_table(&ff_mv_tables[0]); | |||||
init_mv_table(&ff_mv_tables[1]); | |||||
for(i=0;i<NB_RL_TABLES;i++) | |||||
ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]); | |||||
for(i=0; i<NB_RL_TABLES; i++){ | |||||
int level; | |||||
for (level = 1; level <= MAX_LEVEL; level++) { | |||||
int run; | |||||
for(run=0; run<=MAX_RUN; run++){ | |||||
int last; | |||||
for(last=0; last<2; last++){ | |||||
rl_length[i][level][run][last]= get_size_of_code(s, &ff_rl_table[ i], last, run, level, 0); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
static void find_best_tables(MpegEncContext * s) | |||||
{ | |||||
int i; | |||||
int best = 0, best_size = INT_MAX; | |||||
int chroma_best = 0, best_chroma_size = INT_MAX; | |||||
for(i=0; i<3; i++){ | |||||
int level; | |||||
int chroma_size=0; | |||||
int size=0; | |||||
if(i>0){// ;) | |||||
size++; | |||||
chroma_size++; | |||||
} | |||||
for(level=0; level<=MAX_LEVEL; level++){ | |||||
int run; | |||||
for(run=0; run<=MAX_RUN; run++){ | |||||
int last; | |||||
const int last_size= size + chroma_size; | |||||
for(last=0; last<2; last++){ | |||||
int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last]; | |||||
int intra_luma_count = s->ac_stats[1][0][level][run][last]; | |||||
int intra_chroma_count= s->ac_stats[1][1][level][run][last]; | |||||
if(s->pict_type==AV_PICTURE_TYPE_I){ | |||||
size += intra_luma_count *rl_length[i ][level][run][last]; | |||||
chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last]; | |||||
}else{ | |||||
size+= intra_luma_count *rl_length[i ][level][run][last] | |||||
+intra_chroma_count*rl_length[i+3][level][run][last] | |||||
+inter_count *rl_length[i+3][level][run][last]; | |||||
} | |||||
} | |||||
if(last_size == size+chroma_size) break; | |||||
} | |||||
} | |||||
if(size<best_size){ | |||||
best_size= size; | |||||
best= i; | |||||
} | |||||
if(chroma_size<best_chroma_size){ | |||||
best_chroma_size= chroma_size; | |||||
chroma_best= i; | |||||
} | |||||
} | |||||
// printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n", | |||||
// s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size); | |||||
if(s->pict_type==AV_PICTURE_TYPE_P) chroma_best= best; | |||||
memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2); | |||||
s->rl_table_index = best; | |||||
s->rl_chroma_table_index= chroma_best; | |||||
if(s->pict_type != s->last_non_b_pict_type){ | |||||
s->rl_table_index= 2; | |||||
if(s->pict_type==AV_PICTURE_TYPE_I) | |||||
s->rl_chroma_table_index= 1; | |||||
else | |||||
s->rl_chroma_table_index= 2; | |||||
} | |||||
} | |||||
/* write MSMPEG4 compatible frame header */ | |||||
void ff_msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) | |||||
{ | |||||
find_best_tables(s); | |||||
avpriv_align_put_bits(&s->pb); | |||||
put_bits(&s->pb, 2, s->pict_type - 1); | |||||
put_bits(&s->pb, 5, s->qscale); | |||||
if(s->msmpeg4_version<=2){ | |||||
s->rl_table_index = 2; | |||||
s->rl_chroma_table_index = 2; | |||||
} | |||||
s->dc_table_index = 1; | |||||
s->mv_table_index = 1; /* only if P frame */ | |||||
s->use_skip_mb_code = 1; /* only if P frame */ | |||||
s->per_mb_rl_table = 0; | |||||
if(s->msmpeg4_version==4) | |||||
s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==AV_PICTURE_TYPE_P); | |||||
//printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height); | |||||
if (s->pict_type == AV_PICTURE_TYPE_I) { | |||||
s->slice_height= s->mb_height/1; | |||||
put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height); | |||||
if(s->msmpeg4_version==4){ | |||||
ff_msmpeg4_encode_ext_header(s); | |||||
if(s->bit_rate>MBAC_BITRATE) | |||||
put_bits(&s->pb, 1, s->per_mb_rl_table); | |||||
} | |||||
if(s->msmpeg4_version>2){ | |||||
if(!s->per_mb_rl_table){ | |||||
ff_msmpeg4_code012(&s->pb, s->rl_chroma_table_index); | |||||
ff_msmpeg4_code012(&s->pb, s->rl_table_index); | |||||
} | |||||
put_bits(&s->pb, 1, s->dc_table_index); | |||||
} | |||||
} else { | |||||
put_bits(&s->pb, 1, s->use_skip_mb_code); | |||||
if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE) | |||||
put_bits(&s->pb, 1, s->per_mb_rl_table); | |||||
if(s->msmpeg4_version>2){ | |||||
if(!s->per_mb_rl_table) | |||||
ff_msmpeg4_code012(&s->pb, s->rl_table_index); | |||||
put_bits(&s->pb, 1, s->dc_table_index); | |||||
put_bits(&s->pb, 1, s->mv_table_index); | |||||
} | |||||
} | |||||
s->esc3_level_length= 0; | |||||
s->esc3_run_length= 0; | |||||
} | |||||
void ff_msmpeg4_encode_ext_header(MpegEncContext * s) | |||||
{ | |||||
put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29 | |||||
put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047)); | |||||
if(s->msmpeg4_version>=3) | |||||
put_bits(&s->pb, 1, s->flipflop_rounding); | |||||
else | |||||
assert(s->flipflop_rounding==0); | |||||
} | |||||
void ff_msmpeg4_encode_motion(MpegEncContext * s, | |||||
int mx, int my) | |||||
{ | |||||
int code; | |||||
MVTable *mv; | |||||
/* modulo encoding */ | |||||
/* WARNING : you cannot reach all the MVs even with the modulo | |||||
encoding. This is a somewhat strange compromise they took !!! */ | |||||
if (mx <= -64) | |||||
mx += 64; | |||||
else if (mx >= 64) | |||||
mx -= 64; | |||||
if (my <= -64) | |||||
my += 64; | |||||
else if (my >= 64) | |||||
my -= 64; | |||||
mx += 32; | |||||
my += 32; | |||||
#if 0 | |||||
if ((unsigned)mx >= 64 || | |||||
(unsigned)my >= 64) | |||||
av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my); | |||||
#endif | |||||
mv = &ff_mv_tables[s->mv_table_index]; | |||||
code = mv->table_mv_index[(mx << 6) | my]; | |||||
put_bits(&s->pb, | |||||
mv->table_mv_bits[code], | |||||
mv->table_mv_code[code]); | |||||
if (code == mv->n) { | |||||
/* escape : code literally */ | |||||
put_bits(&s->pb, 6, mx); | |||||
put_bits(&s->pb, 6, my); | |||||
} | |||||
} | |||||
void ff_msmpeg4_handle_slices(MpegEncContext *s){ | |||||
if (s->mb_x == 0) { | |||||
if (s->slice_height && (s->mb_y % s->slice_height) == 0) { | |||||
if(s->msmpeg4_version < 4){ | |||||
ff_mpeg4_clean_buffers(s); | |||||
} | |||||
s->first_slice_line = 1; | |||||
} else { | |||||
s->first_slice_line = 0; | |||||
} | |||||
} | |||||
} | |||||
static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) | |||||
{ | |||||
int range, bit_size, sign, code, bits; | |||||
if (val == 0) { | |||||
/* zero vector */ | |||||
code = 0; | |||||
put_bits(&s->pb, ff_mvtab[code][1], ff_mvtab[code][0]); | |||||
} else { | |||||
bit_size = s->f_code - 1; | |||||
range = 1 << bit_size; | |||||
if (val <= -64) | |||||
val += 64; | |||||
else if (val >= 64) | |||||
val -= 64; | |||||
if (val >= 0) { | |||||
sign = 0; | |||||
} else { | |||||
val = -val; | |||||
sign = 1; | |||||
} | |||||
val--; | |||||
code = (val >> bit_size) + 1; | |||||
bits = val & (range - 1); | |||||
put_bits(&s->pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign); | |||||
if (bit_size > 0) { | |||||
put_bits(&s->pb, bit_size, bits); | |||||
} | |||||
} | |||||
} | |||||
void ff_msmpeg4_encode_mb(MpegEncContext * s, | |||||
DCTELEM block[6][64], | |||||
int motion_x, int motion_y) | |||||
{ | |||||
int cbp, coded_cbp, i; | |||||
int pred_x, pred_y; | |||||
uint8_t *coded_block; | |||||
ff_msmpeg4_handle_slices(s); | |||||
if (!s->mb_intra) { | |||||
/* compute cbp */ | |||||
cbp = 0; | |||||
for (i = 0; i < 6; i++) { | |||||
if (s->block_last_index[i] >= 0) | |||||
cbp |= 1 << (5 - i); | |||||
} | |||||
if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { | |||||
/* skip macroblock */ | |||||
put_bits(&s->pb, 1, 1); | |||||
s->last_bits++; | |||||
s->misc_bits++; | |||||
s->skip_count++; | |||||
return; | |||||
} | |||||
if (s->use_skip_mb_code) | |||||
put_bits(&s->pb, 1, 0); /* mb coded */ | |||||
if(s->msmpeg4_version<=2){ | |||||
put_bits(&s->pb, | |||||
ff_v2_mb_type[cbp&3][1], | |||||
ff_v2_mb_type[cbp&3][0]); | |||||
if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C; | |||||
else coded_cbp= cbp; | |||||
put_bits(&s->pb, | |||||
ff_h263_cbpy_tab[coded_cbp>>2][1], | |||||
ff_h263_cbpy_tab[coded_cbp>>2][0]); | |||||
s->misc_bits += get_bits_diff(s); | |||||
ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); | |||||
msmpeg4v2_encode_motion(s, motion_x - pred_x); | |||||
msmpeg4v2_encode_motion(s, motion_y - pred_y); | |||||
}else{ | |||||
put_bits(&s->pb, | |||||
ff_table_mb_non_intra[cbp + 64][1], | |||||
ff_table_mb_non_intra[cbp + 64][0]); | |||||
s->misc_bits += get_bits_diff(s); | |||||
/* motion vector */ | |||||
ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); | |||||
ff_msmpeg4_encode_motion(s, motion_x - pred_x, | |||||
motion_y - pred_y); | |||||
} | |||||
s->mv_bits += get_bits_diff(s); | |||||
for (i = 0; i < 6; i++) { | |||||
ff_msmpeg4_encode_block(s, block[i], i); | |||||
} | |||||
s->p_tex_bits += get_bits_diff(s); | |||||
} else { | |||||
/* compute cbp */ | |||||
cbp = 0; | |||||
coded_cbp = 0; | |||||
for (i = 0; i < 6; i++) { | |||||
int val, pred; | |||||
val = (s->block_last_index[i] >= 1); | |||||
cbp |= val << (5 - i); | |||||
if (i < 4) { | |||||
/* predict value for close blocks only for luma */ | |||||
pred = ff_msmpeg4_coded_block_pred(s, i, &coded_block); | |||||
*coded_block = val; | |||||
val = val ^ pred; | |||||
} | |||||
coded_cbp |= val << (5 - i); | |||||
} | |||||
if(s->msmpeg4_version<=2){ | |||||
if (s->pict_type == AV_PICTURE_TYPE_I) { | |||||
put_bits(&s->pb, | |||||
ff_v2_intra_cbpc[cbp&3][1], ff_v2_intra_cbpc[cbp&3][0]); | |||||
} else { | |||||
if (s->use_skip_mb_code) | |||||
put_bits(&s->pb, 1, 0); /* mb coded */ | |||||
put_bits(&s->pb, | |||||
ff_v2_mb_type[(cbp&3) + 4][1], | |||||
ff_v2_mb_type[(cbp&3) + 4][0]); | |||||
} | |||||
put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | |||||
put_bits(&s->pb, | |||||
ff_h263_cbpy_tab[cbp>>2][1], | |||||
ff_h263_cbpy_tab[cbp>>2][0]); | |||||
}else{ | |||||
if (s->pict_type == AV_PICTURE_TYPE_I) { | |||||
put_bits(&s->pb, | |||||
ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); | |||||
} else { | |||||
if (s->use_skip_mb_code) | |||||
put_bits(&s->pb, 1, 0); /* mb coded */ | |||||
put_bits(&s->pb, | |||||
ff_table_mb_non_intra[cbp][1], | |||||
ff_table_mb_non_intra[cbp][0]); | |||||
} | |||||
put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | |||||
if(s->inter_intra_pred){ | |||||
s->h263_aic_dir=0; | |||||
put_bits(&s->pb, ff_table_inter_intra[s->h263_aic_dir][1], ff_table_inter_intra[s->h263_aic_dir][0]); | |||||
} | |||||
} | |||||
s->misc_bits += get_bits_diff(s); | |||||
for (i = 0; i < 6; i++) { | |||||
ff_msmpeg4_encode_block(s, block[i], i); | |||||
} | |||||
s->i_tex_bits += get_bits_diff(s); | |||||
s->i_count++; | |||||
} | |||||
} | |||||
static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) | |||||
{ | |||||
int sign, code; | |||||
int pred, extquant; | |||||
int extrabits = 0; | |||||
int16_t *dc_val; | |||||
pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); | |||||
/* update predictor */ | |||||
if (n < 4) { | |||||
*dc_val = level * s->y_dc_scale; | |||||
} else { | |||||
*dc_val = level * s->c_dc_scale; | |||||
} | |||||
/* do the prediction */ | |||||
level -= pred; | |||||
if(s->msmpeg4_version<=2){ | |||||
if (n < 4) { | |||||
put_bits(&s->pb, | |||||
ff_v2_dc_lum_table[level + 256][1], | |||||
ff_v2_dc_lum_table[level + 256][0]); | |||||
}else{ | |||||
put_bits(&s->pb, | |||||
ff_v2_dc_chroma_table[level + 256][1], | |||||
ff_v2_dc_chroma_table[level + 256][0]); | |||||
} | |||||
}else{ | |||||
sign = 0; | |||||
if (level < 0) { | |||||
level = -level; | |||||
sign = 1; | |||||
} | |||||
code = level; | |||||
if (code > DC_MAX) | |||||
code = DC_MAX; | |||||
else if( s->msmpeg4_version>=6 ) { | |||||
if( s->qscale == 1 ) { | |||||
extquant = (level + 3) & 0x3; | |||||
code = ((level+3)>>2); | |||||
} else if( s->qscale == 2 ) { | |||||
extquant = (level + 1) & 0x1; | |||||
code = ((level+1)>>1); | |||||
} | |||||
} | |||||
if (s->dc_table_index == 0) { | |||||
if (n < 4) { | |||||
put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]); | |||||
} else { | |||||
put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]); | |||||
} | |||||
} else { | |||||
if (n < 4) { | |||||
put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]); | |||||
} else { | |||||
put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]); | |||||
} | |||||
} | |||||
if(s->msmpeg4_version>=6 && s->qscale<=2) | |||||
extrabits = 3 - s->qscale; | |||||
if (code == DC_MAX) | |||||
put_bits(&s->pb, 8 + extrabits, level); | |||||
else if(extrabits > 0)//== VC1 && s->qscale<=2 | |||||
put_bits(&s->pb, extrabits, extquant); | |||||
if (level != 0) { | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
} | |||||
} | |||||
/* Encoding of a block. Very similar to MPEG4 except for a different | |||||
escape coding (same as H263) and more vlc tables. | |||||
*/ | |||||
void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n) | |||||
{ | |||||
int level, run, last, i, j, last_index; | |||||
int last_non_zero, sign, slevel; | |||||
int code, run_diff, dc_pred_dir; | |||||
const RLTable *rl; | |||||
const uint8_t *scantable; | |||||
if (s->mb_intra) { | |||||
msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir); | |||||
i = 1; | |||||
if (n < 4) { | |||||
rl = &ff_rl_table[s->rl_table_index]; | |||||
} else { | |||||
rl = &ff_rl_table[3 + s->rl_chroma_table_index]; | |||||
} | |||||
run_diff = s->msmpeg4_version>=4; | |||||
scantable= s->intra_scantable.permutated; | |||||
} else { | |||||
i = 0; | |||||
rl = &ff_rl_table[3 + s->rl_table_index]; | |||||
if(s->msmpeg4_version<=2) | |||||
run_diff = 0; | |||||
else | |||||
run_diff = 1; | |||||
scantable= s->inter_scantable.permutated; | |||||
} | |||||
/* recalculate block_last_index for M$ wmv1 */ | |||||
if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){ | |||||
for(last_index=63; last_index>=0; last_index--){ | |||||
if(block[scantable[last_index]]) break; | |||||
} | |||||
s->block_last_index[n]= last_index; | |||||
}else | |||||
last_index = s->block_last_index[n]; | |||||
/* AC coefs */ | |||||
last_non_zero = i - 1; | |||||
for (; i <= last_index; i++) { | |||||
j = scantable[i]; | |||||
level = block[j]; | |||||
if (level) { | |||||
run = i - last_non_zero - 1; | |||||
last = (i == last_index); | |||||
sign = 0; | |||||
slevel = level; | |||||
if (level < 0) { | |||||
sign = 1; | |||||
level = -level; | |||||
} | |||||
if(level<=MAX_LEVEL && run<=MAX_RUN){ | |||||
s->ac_stats[s->mb_intra][n>3][level][run][last]++; | |||||
} | |||||
s->ac_stats[s->mb_intra][n > 3][40][63][0]++; //esc3 like | |||||
code = get_rl_index(rl, last, run, level); | |||||
put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |||||
if (code == rl->n) { | |||||
int level1, run1; | |||||
level1 = level - rl->max_level[last][run]; | |||||
if (level1 < 1) | |||||
goto esc2; | |||||
code = get_rl_index(rl, last, run, level1); | |||||
if (code == rl->n) { | |||||
esc2: | |||||
put_bits(&s->pb, 1, 0); | |||||
if (level > MAX_LEVEL) | |||||
goto esc3; | |||||
run1 = run - rl->max_run[last][level] - run_diff; | |||||
if (run1 < 0) | |||||
goto esc3; | |||||
code = get_rl_index(rl, last, run1+1, level); | |||||
if (s->msmpeg4_version == 4 && code == rl->n) | |||||
goto esc3; | |||||
code = get_rl_index(rl, last, run1, level); | |||||
if (code == rl->n) { | |||||
esc3: | |||||
/* third escape */ | |||||
put_bits(&s->pb, 1, 0); | |||||
put_bits(&s->pb, 1, last); | |||||
if(s->msmpeg4_version>=4){ | |||||
if(s->esc3_level_length==0){ | |||||
s->esc3_level_length=8; | |||||
s->esc3_run_length= 6; | |||||
//ESCLVLSZ + ESCRUNSZ | |||||
if(s->qscale<8) | |||||
put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3); | |||||
else | |||||
put_bits(&s->pb, 8, 3); | |||||
} | |||||
put_bits(&s->pb, s->esc3_run_length, run); | |||||
put_bits(&s->pb, 1, sign); | |||||
put_bits(&s->pb, s->esc3_level_length, level); | |||||
}else{ | |||||
put_bits(&s->pb, 6, run); | |||||
put_sbits(&s->pb, 8, slevel); | |||||
} | |||||
} else { | |||||
/* second escape */ | |||||
put_bits(&s->pb, 1, 1); | |||||
put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
} else { | |||||
/* first escape */ | |||||
put_bits(&s->pb, 1, 1); | |||||
put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
} else { | |||||
put_bits(&s->pb, 1, sign); | |||||
} | |||||
last_non_zero = i; | |||||
} | |||||
} | |||||
} |
@@ -28,7 +28,7 @@ static int pam_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
PNMContext *s = avctx->priv_data; | PNMContext *s = avctx->priv_data; | ||||
AVFrame * const p = (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
int i, h, w, n, linesize, depth, maxval, ret; | int i, h, w, n, linesize, depth, maxval, ret; | ||||
const char *tuple_type; | const char *tuple_type; | ||||
uint8_t *ptr; | uint8_t *ptr; | ||||
@@ -198,8 +198,8 @@ av_cold int ff_pnm_init(AVCodecContext *avctx) | |||||
{ | { | ||||
PNMContext *s = avctx->priv_data; | PNMContext *s = avctx->priv_data; | ||||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||||
avctx->coded_frame = (AVFrame*)&s->picture; | |||||
avcodec_get_frame_defaults(&s->picture); | |||||
avctx->coded_frame = &s->picture; | |||||
return 0; | return 0; | ||||
} | } |
@@ -31,7 +31,7 @@ static int pnm_decode_frame(AVCodecContext *avctx, void *data, | |||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
PNMContext * const s = avctx->priv_data; | PNMContext * const s = avctx->priv_data; | ||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame * const p = (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
int i, j, n, linesize, h, upgrade = 0, is_mono = 0; | int i, j, n, linesize, h, upgrade = 0, is_mono = 0; | ||||
unsigned char *ptr; | unsigned char *ptr; | ||||
int components, sample_len; | int components, sample_len; | ||||
@@ -184,7 +184,7 @@ static int pnm_decode_frame(AVCodecContext *avctx, void *data, | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
*picture = *(AVFrame*)&s->picture; | |||||
*picture = s->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
return s->bytestream - s->bytestream_start; | return s->bytestream - s->bytestream_start; | ||||
@@ -28,7 +28,7 @@ static int pnm_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
PNMContext *s = avctx->priv_data; | PNMContext *s = avctx->priv_data; | ||||
AVFrame * const p = (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
int i, h, h1, c, n, linesize, ret; | int i, h, h1, c, n, linesize, ret; | ||||
uint8_t *ptr, *ptr1, *ptr2; | uint8_t *ptr, *ptr1, *ptr2; | ||||
@@ -75,8 +75,8 @@ static const vec_s8 h_subpel_filters_outer[3] = | |||||
dstv = vec_sra(dstv, c7) | dstv = vec_sra(dstv, c7) | ||||
static av_always_inline | static av_always_inline | ||||
void put_vp8_epel_h_altivec_core(uint8_t *dst, int dst_stride, | |||||
uint8_t *src, int src_stride, | |||||
void put_vp8_epel_h_altivec_core(uint8_t *dst, ptrdiff_t dst_stride, | |||||
uint8_t *src, ptrdiff_t src_stride, | |||||
int h, int mx, int w, int is6tap) | int h, int mx, int w, int is6tap) | ||||
{ | { | ||||
LOAD_H_SUBPEL_FILTER(mx-1); | LOAD_H_SUBPEL_FILTER(mx-1); | ||||
@@ -161,8 +161,8 @@ static const vec_u8 v_subpel_filters[7] = | |||||
dstv = vec_sra(dstv, c7) | dstv = vec_sra(dstv, c7) | ||||
static av_always_inline | static av_always_inline | ||||
void put_vp8_epel_v_altivec_core(uint8_t *dst, int dst_stride, | |||||
uint8_t *src, int src_stride, | |||||
void put_vp8_epel_v_altivec_core(uint8_t *dst, ptrdiff_t dst_stride, | |||||
uint8_t *src, ptrdiff_t src_stride, | |||||
int h, int my, int w, int is6tap) | int h, int my, int w, int is6tap) | ||||
{ | { | ||||
LOAD_V_SUBPEL_FILTER(my-1); | LOAD_V_SUBPEL_FILTER(my-1); | ||||
@@ -226,19 +226,19 @@ void put_vp8_epel_v_altivec_core(uint8_t *dst, int dst_stride, | |||||
#define EPEL_FUNCS(WIDTH, TAPS) \ | #define EPEL_FUNCS(WIDTH, TAPS) \ | ||||
static av_noinline \ | static av_noinline \ | ||||
void put_vp8_epel ## WIDTH ## _h ## TAPS ## _altivec(uint8_t *dst, int dst_stride, uint8_t *src, int src_stride, int h, int mx, int my) \ | |||||
void put_vp8_epel ## WIDTH ## _h ## TAPS ## _altivec(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
put_vp8_epel_h_altivec_core(dst, dst_stride, src, src_stride, h, mx, WIDTH, TAPS == 6); \ | put_vp8_epel_h_altivec_core(dst, dst_stride, src, src_stride, h, mx, WIDTH, TAPS == 6); \ | ||||
} \ | } \ | ||||
\ | \ | ||||
static av_noinline \ | static av_noinline \ | ||||
void put_vp8_epel ## WIDTH ## _v ## TAPS ## _altivec(uint8_t *dst, int dst_stride, uint8_t *src, int src_stride, int h, int mx, int my) \ | |||||
void put_vp8_epel ## WIDTH ## _v ## TAPS ## _altivec(uint8_t *dst, ptrdiff_t dst_stride, uint8_t *src, ptrdiff_t src_stride, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
put_vp8_epel_v_altivec_core(dst, dst_stride, src, src_stride, h, my, WIDTH, TAPS == 6); \ | put_vp8_epel_v_altivec_core(dst, dst_stride, src, src_stride, h, my, WIDTH, TAPS == 6); \ | ||||
} | } | ||||
#define EPEL_HV(WIDTH, HTAPS, VTAPS) \ | #define EPEL_HV(WIDTH, HTAPS, VTAPS) \ | ||||
static void put_vp8_epel ## WIDTH ## _h ## HTAPS ## v ## VTAPS ## _altivec(uint8_t *dst, int stride, uint8_t *src, int s, int h, int mx, int my) \ | |||||
static void put_vp8_epel ## WIDTH ## _h ## HTAPS ## v ## VTAPS ## _altivec(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
DECLARE_ALIGNED(16, uint8_t, tmp)[(2*WIDTH+5)*16]; \ | DECLARE_ALIGNED(16, uint8_t, tmp)[(2*WIDTH+5)*16]; \ | ||||
if (VTAPS == 6) { \ | if (VTAPS == 6) { \ | ||||
@@ -266,7 +266,7 @@ EPEL_HV(4, 4,6) | |||||
EPEL_HV(4, 6,4) | EPEL_HV(4, 6,4) | ||||
EPEL_HV(4, 4,4) | EPEL_HV(4, 4,4) | ||||
static void put_vp8_pixels16_altivec(uint8_t *dst, int stride, uint8_t *src, int s, int h, int mx, int my) | |||||
static void put_vp8_pixels16_altivec(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s, int h, int mx, int my) | |||||
{ | { | ||||
ff_put_pixels16_altivec(dst, src, stride, h); | ff_put_pixels16_altivec(dst, src, stride, h); | ||||
} | } | ||||
@@ -40,7 +40,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf_end = avpkt->data + avpkt->size; | const uint8_t *buf_end = avpkt->data + avpkt->size; | ||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
QdrawContext * const a = avctx->priv_data; | QdrawContext * const a = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&a->pic; | |||||
AVFrame * const p = &a->pic; | |||||
uint8_t* outdata; | uint8_t* outdata; | ||||
int colors; | int colors; | ||||
int i; | int i; | ||||
@@ -259,8 +259,8 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
QpegContext * const a = avctx->priv_data; | QpegContext * const a = avctx->priv_data; | ||||
AVFrame * p= (AVFrame*)&a->pic; | |||||
AVFrame * ref= (AVFrame*)&a->ref; | |||||
AVFrame * p = &a->pic; | |||||
AVFrame * ref= &a->ref; | |||||
uint8_t* outdata; | uint8_t* outdata; | ||||
int delta, ret = 0; | int delta, ret = 0; | ||||
const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); | const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); | ||||
@@ -311,8 +311,8 @@ static av_cold int decode_init(AVCodecContext *avctx){ | |||||
static av_cold int decode_end(AVCodecContext *avctx){ | static av_cold int decode_end(AVCodecContext *avctx){ | ||||
QpegContext * const a = avctx->priv_data; | QpegContext * const a = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&a->pic; | |||||
AVFrame * const ref= (AVFrame*)&a->ref; | |||||
AVFrame * const p = &a->pic; | |||||
AVFrame * const ref= &a->ref; | |||||
if(p->data[0]) | if(p->data[0]) | ||||
avctx->release_buffer(avctx, p); | avctx->release_buffer(avctx, p); | ||||
@@ -140,8 +140,8 @@ static int raw_decode(AVCodecContext *avctx, | |||||
int linesize_align = 4; | int linesize_align = 4; | ||||
RawVideoContext *context = avctx->priv_data; | RawVideoContext *context = avctx->priv_data; | ||||
AVFrame * frame = (AVFrame *) data; | |||||
AVPicture * picture = (AVPicture *) data; | |||||
AVFrame *frame = data; | |||||
AVPicture *picture = data; | |||||
frame->pict_type = avctx->coded_frame->pict_type; | frame->pict_type = avctx->coded_frame->pict_type; | ||||
frame->interlaced_frame = avctx->coded_frame->interlaced_frame; | frame->interlaced_frame = avctx->coded_frame->interlaced_frame; | ||||
@@ -32,7 +32,7 @@ | |||||
static av_cold int raw_init_encoder(AVCodecContext *avctx) | static av_cold int raw_init_encoder(AVCodecContext *avctx) | ||||
{ | { | ||||
avctx->coded_frame = (AVFrame *)avctx->priv_data; | |||||
avctx->coded_frame = avctx->priv_data; | |||||
avcodec_get_frame_defaults(avctx->coded_frame); | avcodec_get_frame_defaults(avctx->coded_frame); | ||||
avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; | avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; | ||||
avctx->bits_per_coded_sample = av_get_bits_per_pixel(&av_pix_fmt_descriptors[avctx->pix_fmt]); | avctx->bits_per_coded_sample = av_get_bits_per_pixel(&av_pix_fmt_descriptors[avctx->pix_fmt]); | ||||
@@ -515,9 +515,10 @@ static int rv10_decode_packet(AVCodecContext *avctx, | |||||
const uint8_t *buf, int buf_size, int buf_size2) | const uint8_t *buf, int buf_size, int buf_size2) | ||||
{ | { | ||||
MpegEncContext *s = avctx->priv_data; | MpegEncContext *s = avctx->priv_data; | ||||
int mb_count, mb_pos, left, start_mb_x; | |||||
int mb_count, mb_pos, left, start_mb_x, active_bits_size; | |||||
init_get_bits(&s->gb, buf, buf_size*8); | |||||
active_bits_size = buf_size * 8; | |||||
init_get_bits(&s->gb, buf, FFMAX(buf_size, buf_size2) * 8); | |||||
if(s->codec_id ==CODEC_ID_RV10) | if(s->codec_id ==CODEC_ID_RV10) | ||||
mb_count = rv10_decode_picture_header(s); | mb_count = rv10_decode_picture_header(s); | ||||
else | else | ||||
@@ -601,13 +602,26 @@ static int rv10_decode_packet(AVCodecContext *avctx, | |||||
s->mv_type = MV_TYPE_16X16; | s->mv_type = MV_TYPE_16X16; | ||||
ret=ff_h263_decode_mb(s, s->block); | ret=ff_h263_decode_mb(s, s->block); | ||||
if (ret != SLICE_ERROR && s->gb.size_in_bits < get_bits_count(&s->gb) && 8*buf_size2 >= get_bits_count(&s->gb)){ | |||||
av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n", s->gb.size_in_bits, 8*buf_size2); | |||||
s->gb.size_in_bits= 8*buf_size2; | |||||
// Repeat the slice end check from ff_h263_decode_mb with our active | |||||
// bitstream size | |||||
if (ret != SLICE_ERROR) { | |||||
int v = show_bits(&s->gb, 16); | |||||
if (get_bits_count(&s->gb) + 16 > active_bits_size) | |||||
v >>= get_bits_count(&s->gb) + 16 - active_bits_size; | |||||
if (!v) | |||||
ret = SLICE_END; | |||||
} | |||||
if (ret != SLICE_ERROR && active_bits_size < get_bits_count(&s->gb) && | |||||
8 * buf_size2 >= get_bits_count(&s->gb)) { | |||||
active_bits_size = buf_size2 * 8; | |||||
av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n", | |||||
8 * buf_size, active_bits_size); | |||||
ret= SLICE_OK; | ret= SLICE_OK; | ||||
} | } | ||||
if (ret == SLICE_ERROR || s->gb.size_in_bits < get_bits_count(&s->gb)) { | |||||
if (ret == SLICE_ERROR || active_bits_size < get_bits_count(&s->gb)) { | |||||
av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y); | av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -629,7 +643,7 @@ static int rv10_decode_packet(AVCodecContext *avctx, | |||||
ff_er_add_slice(s, start_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_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 active_bits_size; | |||||
} | } | ||||
static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n) | static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n) | ||||
@@ -661,8 +675,12 @@ static int rv10_decode_frame(AVCodecContext *avctx, | |||||
if(!avctx->slice_count){ | if(!avctx->slice_count){ | ||||
slice_count = (*buf++) + 1; | slice_count = (*buf++) + 1; | ||||
buf_size--; | |||||
slices_hdr = buf + 4; | slices_hdr = buf + 4; | ||||
buf += 8 * slice_count; | buf += 8 * slice_count; | ||||
buf_size -= 8 * slice_count; | |||||
if (buf_size <= 0) | |||||
return AVERROR_INVALIDDATA; | |||||
}else | }else | ||||
slice_count = avctx->slice_count; | slice_count = avctx->slice_count; | ||||
@@ -696,9 +714,9 @@ static int rv10_decode_frame(AVCodecContext *avctx, | |||||
ff_MPV_frame_end(s); | ff_MPV_frame_end(s); | ||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | ||||
*pict= *(AVFrame*)s->current_picture_ptr; | |||||
*pict = s->current_picture_ptr->f; | |||||
} else if (s->last_picture_ptr != NULL) { | } else if (s->last_picture_ptr != NULL) { | ||||
*pict= *(AVFrame*)s->last_picture_ptr; | |||||
*pict = s->last_picture_ptr->f; | |||||
} | } | ||||
if(s->last_picture_ptr || s->low_delay){ | if(s->last_picture_ptr || s->low_delay){ | ||||
@@ -708,7 +726,7 @@ static int rv10_decode_frame(AVCodecContext *avctx, | |||||
s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...) | s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...) | ||||
} | } | ||||
return buf_size; | |||||
return avpkt->size; | |||||
} | } | ||||
AVCodec ff_rv10_decoder = { | AVCodec ff_rv10_decoder = { | ||||
@@ -1660,7 +1660,7 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, | |||||
if (buf_size == 0) { | if (buf_size == 0) { | ||||
/* special case for last picture */ | /* special case for last picture */ | ||||
if (s->low_delay==0 && s->next_picture_ptr) { | if (s->low_delay==0 && s->next_picture_ptr) { | ||||
*pict = *(AVFrame*)s->next_picture_ptr; | |||||
*pict = s->next_picture_ptr->f; | |||||
s->next_picture_ptr = NULL; | s->next_picture_ptr = NULL; | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
@@ -1747,9 +1747,9 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, | |||||
ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0); | ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0); | ||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | ||||
*pict = *(AVFrame*)s->current_picture_ptr; | |||||
*pict = s->current_picture_ptr->f; | |||||
} else if (s->last_picture_ptr != NULL) { | } else if (s->last_picture_ptr != NULL) { | ||||
*pict = *(AVFrame*)s->last_picture_ptr; | |||||
*pict = s->last_picture_ptr->f; | |||||
} | } | ||||
if(s->last_picture_ptr || s->low_delay){ | if(s->last_picture_ptr || s->low_delay){ | ||||
@@ -735,7 +735,7 @@ static int svq1_decode_frame(AVCodecContext *avctx, | |||||
} | } | ||||
} | } | ||||
*pict = *(AVFrame*)&s->current_picture; | |||||
*pict = s->current_picture.f; | |||||
ff_MPV_frame_end(s); | ff_MPV_frame_end(s); | ||||
@@ -473,7 +473,7 @@ static av_cold int svq1_encode_init(AVCodecContext *avctx) | |||||
SVQ1Context * const s = avctx->priv_data; | SVQ1Context * const s = avctx->priv_data; | ||||
ff_dsputil_init(&s->dsp, avctx); | ff_dsputil_init(&s->dsp, avctx); | ||||
avctx->coded_frame= (AVFrame*)&s->picture; | |||||
avctx->coded_frame = &s->picture; | |||||
s->frame_width = avctx->width; | s->frame_width = avctx->width; | ||||
s->frame_height = avctx->height; | s->frame_height = avctx->height; | ||||
@@ -501,7 +501,7 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
SVQ1Context * const s = avctx->priv_data; | SVQ1Context * const s = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
AVFrame temp; | AVFrame temp; | ||||
int i, ret; | int i, ret; | ||||
@@ -958,7 +958,7 @@ static int svq3_decode_frame(AVCodecContext *avctx, | |||||
/* special case for last picture */ | /* special case for last picture */ | ||||
if (buf_size == 0) { | if (buf_size == 0) { | ||||
if (s->next_picture_ptr && !s->low_delay) { | if (s->next_picture_ptr && !s->low_delay) { | ||||
*(AVFrame *) data = *(AVFrame *) &s->next_picture; | |||||
*(AVFrame *) data = s->next_picture.f; | |||||
s->next_picture_ptr = NULL; | s->next_picture_ptr = NULL; | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
} | } | ||||
@@ -1101,9 +1101,9 @@ static int svq3_decode_frame(AVCodecContext *avctx, | |||||
ff_MPV_frame_end(s); | ff_MPV_frame_end(s); | ||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | ||||
*(AVFrame *) data = *(AVFrame *) &s->current_picture; | |||||
*(AVFrame *) data = s->current_picture.f; | |||||
} else { | } else { | ||||
*(AVFrame *) data = *(AVFrame *) &s->last_picture; | |||||
*(AVFrame *) data = s->last_picture.f; | |||||
} | } | ||||
/* Do not output the last pic after seeking. */ | /* Do not output the last pic after seeking. */ | ||||
@@ -106,7 +106,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf_end = avpkt->data + avpkt->size; | const uint8_t *buf_end = avpkt->data + avpkt->size; | ||||
TargaContext * const s = avctx->priv_data; | TargaContext * const s = avctx->priv_data; | ||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
uint8_t *dst; | uint8_t *dst; | ||||
int stride; | int stride; | ||||
int idlen, pal, compr, y, w, h, bpp, flags; | int idlen, pal, compr, y, w, h, bpp, flags; | ||||
@@ -262,7 +262,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
} | } | ||||
} | } | ||||
*picture= *(AVFrame*)&s->picture; | |||||
*picture = s->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
return avpkt->size; | return avpkt->size; | ||||
@@ -271,8 +271,8 @@ static int decode_frame(AVCodecContext *avctx, | |||||
static av_cold int targa_init(AVCodecContext *avctx){ | static av_cold int targa_init(AVCodecContext *avctx){ | ||||
TargaContext *s = avctx->priv_data; | TargaContext *s = avctx->priv_data; | ||||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||||
avctx->coded_frame= (AVFrame*)&s->picture; | |||||
avcodec_get_frame_defaults(&s->picture); | |||||
avctx->coded_frame = &s->picture; | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -577,7 +577,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
TiffContext * const s = avctx->priv_data; | TiffContext * const s = avctx->priv_data; | ||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame * const p= (AVFrame*)&s->picture; | |||||
AVFrame * const p = &s->picture; | |||||
const uint8_t *orig_buf = buf, *end_buf = buf + buf_size; | const uint8_t *orig_buf = buf, *end_buf = buf + buf_size; | ||||
unsigned off; | unsigned off; | ||||
int id, le, ret; | int id, le, ret; | ||||
@@ -691,7 +691,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
dst += s->picture.linesize[0]; | dst += s->picture.linesize[0]; | ||||
} | } | ||||
} | } | ||||
*picture= *(AVFrame*)&s->picture; | |||||
*picture = s->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
return buf_size; | return buf_size; | ||||
@@ -703,8 +703,8 @@ static av_cold int tiff_init(AVCodecContext *avctx){ | |||||
s->width = 0; | s->width = 0; | ||||
s->height = 0; | s->height = 0; | ||||
s->avctx = avctx; | s->avctx = avctx; | ||||
avcodec_get_frame_defaults((AVFrame*)&s->picture); | |||||
avctx->coded_frame= (AVFrame*)&s->picture; | |||||
avcodec_get_frame_defaults(&s->picture); | |||||
avctx->coded_frame = &s->picture; | |||||
ff_lzw_decode_open(&s->lzw); | ff_lzw_decode_open(&s->lzw); | ||||
ff_ccitt_unpack_init(); | ff_ccitt_unpack_init(); | ||||
@@ -206,7 +206,7 @@ static int encode_frame(AVCodecContext * avctx, AVPacket *pkt, | |||||
const AVFrame *pict, int *got_packet) | const AVFrame *pict, int *got_packet) | ||||
{ | { | ||||
TiffEncoderContext *s = avctx->priv_data; | TiffEncoderContext *s = avctx->priv_data; | ||||
AVFrame *const p = (AVFrame *) & s->picture; | |||||
AVFrame *const p = &s->picture; | |||||
int i; | int i; | ||||
uint8_t *ptr; | uint8_t *ptr; | ||||
uint8_t *offset; | uint8_t *offset; | ||||
@@ -767,7 +767,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
TM2Context * const l = avctx->priv_data; | TM2Context * const l = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&l->pic; | |||||
AVFrame * const p = &l->pic; | |||||
int i, skip, t; | int i, skip, t; | ||||
av_fast_padded_malloc(&l->buffer, &l->buffer_size, buf_size); | av_fast_padded_malloc(&l->buffer, &l->buffer_size, buf_size); | ||||
@@ -50,7 +50,7 @@ static av_cold int ulti_decode_init(AVCodecContext *avctx) | |||||
s->height = avctx->height; | s->height = avctx->height; | ||||
s->blocks = (s->width / 8) * (s->height / 8); | s->blocks = (s->width / 8) * (s->height / 8); | ||||
avctx->pix_fmt = PIX_FMT_YUV410P; | avctx->pix_fmt = PIX_FMT_YUV410P; | ||||
avcodec_get_frame_defaults(&s->frame); | |||||
avctx->coded_frame = &s->frame; | |||||
avctx->coded_frame = (AVFrame*) &s->frame; | avctx->coded_frame = (AVFrame*) &s->frame; | ||||
s->ulti_codebook = ulti_codebook; | s->ulti_codebook = ulti_codebook; | ||||
@@ -1226,6 +1226,12 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx, | |||||
avpkt->data = new_data; | avpkt->data = new_data; | ||||
} | } | ||||
if (!user_packet && avpkt->data) { | |||||
uint8_t *new_data = av_realloc(avpkt->data, avpkt->size); | |||||
if (new_data) | |||||
avpkt->data = new_data; | |||||
} | |||||
avctx->frame_number++; | avctx->frame_number++; | ||||
} | } | ||||
@@ -5456,7 +5456,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data, | |||||
if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) { | if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) { | ||||
/* special case for last picture */ | /* special case for last picture */ | ||||
if (s->low_delay == 0 && s->next_picture_ptr) { | if (s->low_delay == 0 && s->next_picture_ptr) { | ||||
*pict = *(AVFrame*)s->next_picture_ptr; | |||||
*pict = s->next_picture_ptr->f; | |||||
s->next_picture_ptr = NULL; | s->next_picture_ptr = NULL; | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
@@ -5764,9 +5764,9 @@ image: | |||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
} else { | } else { | ||||
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) { | ||||
*pict = *(AVFrame*)s->current_picture_ptr; | |||||
*pict = s->current_picture_ptr->f; | |||||
} else if (s->last_picture_ptr != NULL) { | } else if (s->last_picture_ptr != NULL) { | ||||
*pict = *(AVFrame*)s->last_picture_ptr; | |||||
*pict = s->last_picture_ptr->f; | |||||
} | } | ||||
if (s->last_picture_ptr || s->low_delay) { | if (s->last_picture_ptr || s->low_delay) { | ||||
*data_size = sizeof(AVFrame); | *data_size = sizeof(AVFrame); | ||||
@@ -49,7 +49,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
VCR1Context * const a = avctx->priv_data; | VCR1Context * const a = avctx->priv_data; | ||||
AVFrame *picture = data; | AVFrame *picture = data; | ||||
AVFrame * const p= (AVFrame*)&a->picture; | |||||
AVFrame * const p = &a->picture; | |||||
const uint8_t *bytestream= buf; | const uint8_t *bytestream= buf; | ||||
int i, x, y; | int i, x, y; | ||||
@@ -116,7 +116,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
} | } | ||||
} | } | ||||
*picture= *(AVFrame*)&a->picture; | |||||
*picture = a->picture; | |||||
*data_size = sizeof(AVPicture); | *data_size = sizeof(AVPicture); | ||||
return buf_size; | return buf_size; | ||||
@@ -126,7 +126,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | ||||
VCR1Context * const a = avctx->priv_data; | VCR1Context * const a = avctx->priv_data; | ||||
AVFrame *pict = data; | AVFrame *pict = data; | ||||
AVFrame * const p= (AVFrame*)&a->picture; | |||||
AVFrame * const p = &a->picture; | |||||
int size; | int size; | ||||
*p = *pict; | *p = *pict; | ||||
@@ -146,7 +146,7 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, | |||||
static av_cold void common_init(AVCodecContext *avctx){ | static av_cold void common_init(AVCodecContext *avctx){ | ||||
VCR1Context * const a = avctx->priv_data; | VCR1Context * const a = avctx->priv_data; | ||||
avctx->coded_frame= (AVFrame*)&a->picture; | |||||
avctx->coded_frame = &a->picture; | |||||
avcodec_get_frame_defaults(&a->picture); | avcodec_get_frame_defaults(&a->picture); | ||||
a->avctx= avctx; | a->avctx= avctx; | ||||
} | } | ||||
@@ -21,7 +21,7 @@ | |||||
#define AVCODEC_VERSION_H | #define AVCODEC_VERSION_H | ||||
#define LIBAVCODEC_VERSION_MAJOR 54 | #define LIBAVCODEC_VERSION_MAJOR 54 | ||||
#define LIBAVCODEC_VERSION_MINOR 5 | |||||
#define LIBAVCODEC_VERSION_MINOR 6 | |||||
#define LIBAVCODEC_VERSION_MICRO 100 | #define LIBAVCODEC_VERSION_MICRO 100 | ||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||
@@ -77,7 +77,7 @@ static void vp8_luma_dc_wht_dc_c(DCTELEM block[4][4][16], DCTELEM dc[16]) | |||||
#define MUL_20091(a) ((((a)*20091) >> 16) + (a)) | #define MUL_20091(a) ((((a)*20091) >> 16) + (a)) | ||||
#define MUL_35468(a) (((a)*35468) >> 16) | #define MUL_35468(a) (((a)*35468) >> 16) | ||||
static void vp8_idct_add_c(uint8_t *dst, DCTELEM block[16], int stride) | |||||
static void vp8_idct_add_c(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride) | |||||
{ | { | ||||
int i, t0, t1, t2, t3; | int i, t0, t1, t2, t3; | ||||
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; | uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; | ||||
@@ -113,7 +113,7 @@ static void vp8_idct_add_c(uint8_t *dst, DCTELEM block[16], int stride) | |||||
} | } | ||||
} | } | ||||
static void vp8_idct_dc_add_c(uint8_t *dst, DCTELEM block[16], int stride) | |||||
static void vp8_idct_dc_add_c(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride) | |||||
{ | { | ||||
int i, dc = (block[0] + 4) >> 3; | int i, dc = (block[0] + 4) >> 3; | ||||
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP + dc; | uint8_t *cm = ff_cropTbl + MAX_NEG_CROP + dc; | ||||
@@ -128,7 +128,7 @@ static void vp8_idct_dc_add_c(uint8_t *dst, DCTELEM block[16], int stride) | |||||
} | } | ||||
} | } | ||||
static void vp8_idct_dc_add4uv_c(uint8_t *dst, DCTELEM block[4][16], int stride) | |||||
static void vp8_idct_dc_add4uv_c(uint8_t *dst, DCTELEM block[4][16], ptrdiff_t stride) | |||||
{ | { | ||||
vp8_idct_dc_add_c(dst+stride*0+0, block[0], stride); | vp8_idct_dc_add_c(dst+stride*0+0, block[0], stride); | ||||
vp8_idct_dc_add_c(dst+stride*0+4, block[1], stride); | vp8_idct_dc_add_c(dst+stride*0+4, block[1], stride); | ||||
@@ -136,7 +136,7 @@ static void vp8_idct_dc_add4uv_c(uint8_t *dst, DCTELEM block[4][16], int stride) | |||||
vp8_idct_dc_add_c(dst+stride*4+4, block[3], stride); | vp8_idct_dc_add_c(dst+stride*4+4, block[3], stride); | ||||
} | } | ||||
static void vp8_idct_dc_add4y_c(uint8_t *dst, DCTELEM block[4][16], int stride) | |||||
static void vp8_idct_dc_add4y_c(uint8_t *dst, DCTELEM block[4][16], ptrdiff_t stride) | |||||
{ | { | ||||
vp8_idct_dc_add_c(dst+ 0, block[0], stride); | vp8_idct_dc_add_c(dst+ 0, block[0], stride); | ||||
vp8_idct_dc_add_c(dst+ 4, block[1], stride); | vp8_idct_dc_add_c(dst+ 4, block[1], stride); | ||||
@@ -157,7 +157,7 @@ static void vp8_idct_dc_add4y_c(uint8_t *dst, DCTELEM block[4][16], int stride) | |||||
#define clip_int8(n) (cm[n+0x80]-0x80) | #define clip_int8(n) (cm[n+0x80]-0x80) | ||||
static av_always_inline void filter_common(uint8_t *p, int stride, int is4tap) | |||||
static av_always_inline void filter_common(uint8_t *p, ptrdiff_t stride, int is4tap) | |||||
{ | { | ||||
LOAD_PIXELS | LOAD_PIXELS | ||||
int a, f1, f2; | int a, f1, f2; | ||||
@@ -188,7 +188,7 @@ static av_always_inline void filter_common(uint8_t *p, int stride, int is4tap) | |||||
} | } | ||||
} | } | ||||
static av_always_inline int simple_limit(uint8_t *p, int stride, int flim) | |||||
static av_always_inline int simple_limit(uint8_t *p, ptrdiff_t stride, int flim) | |||||
{ | { | ||||
LOAD_PIXELS | LOAD_PIXELS | ||||
return 2*FFABS(p0-q0) + (FFABS(p1-q1) >> 1) <= flim; | return 2*FFABS(p0-q0) + (FFABS(p1-q1) >> 1) <= flim; | ||||
@@ -198,7 +198,7 @@ static av_always_inline int simple_limit(uint8_t *p, int stride, int flim) | |||||
* E - limit at the macroblock edge | * E - limit at the macroblock edge | ||||
* I - limit for interior difference | * I - limit for interior difference | ||||
*/ | */ | ||||
static av_always_inline int normal_limit(uint8_t *p, int stride, int E, int I) | |||||
static av_always_inline int normal_limit(uint8_t *p, ptrdiff_t stride, int E, int I) | |||||
{ | { | ||||
LOAD_PIXELS | LOAD_PIXELS | ||||
return simple_limit(p, stride, E) | return simple_limit(p, stride, E) | ||||
@@ -207,13 +207,13 @@ static av_always_inline int normal_limit(uint8_t *p, int stride, int E, int I) | |||||
} | } | ||||
// high edge variance | // high edge variance | ||||
static av_always_inline int hev(uint8_t *p, int stride, int thresh) | |||||
static av_always_inline int hev(uint8_t *p, ptrdiff_t stride, int thresh) | |||||
{ | { | ||||
LOAD_PIXELS | LOAD_PIXELS | ||||
return FFABS(p1-p0) > thresh || FFABS(q1-q0) > thresh; | return FFABS(p1-p0) > thresh || FFABS(q1-q0) > thresh; | ||||
} | } | ||||
static av_always_inline void filter_mbedge(uint8_t *p, int stride) | |||||
static av_always_inline void filter_mbedge(uint8_t *p, ptrdiff_t stride) | |||||
{ | { | ||||
int a0, a1, a2, w; | int a0, a1, a2, w; | ||||
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; | uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; | ||||
@@ -236,7 +236,7 @@ static av_always_inline void filter_mbedge(uint8_t *p, int stride) | |||||
} | } | ||||
#define LOOP_FILTER(dir, size, stridea, strideb, maybe_inline) \ | #define LOOP_FILTER(dir, size, stridea, strideb, maybe_inline) \ | ||||
static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, int stride,\ | |||||
static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, ptrdiff_t stride,\ | |||||
int flim_E, int flim_I, int hev_thresh)\ | int flim_E, int flim_I, int hev_thresh)\ | ||||
{\ | {\ | ||||
int i;\ | int i;\ | ||||
@@ -250,7 +250,7 @@ static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _c(uint8_t *dst, | |||||
}\ | }\ | ||||
}\ | }\ | ||||
\ | \ | ||||
static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _inner_c(uint8_t *dst, int stride,\ | |||||
static maybe_inline void vp8_ ## dir ## _loop_filter ## size ## _inner_c(uint8_t *dst, ptrdiff_t stride,\ | |||||
int flim_E, int flim_I, int hev_thresh)\ | int flim_E, int flim_I, int hev_thresh)\ | ||||
{\ | {\ | ||||
int i;\ | int i;\ | ||||
@@ -270,13 +270,13 @@ LOOP_FILTER(h, 16, stride, 1,) | |||||
#define UV_LOOP_FILTER(dir, stridea, strideb) \ | #define UV_LOOP_FILTER(dir, stridea, strideb) \ | ||||
LOOP_FILTER(dir, 8, stridea, strideb, av_always_inline) \ | LOOP_FILTER(dir, 8, stridea, strideb, av_always_inline) \ | ||||
static void vp8_ ## dir ## _loop_filter8uv_c(uint8_t *dstU, uint8_t *dstV, int stride,\ | |||||
static void vp8_ ## dir ## _loop_filter8uv_c(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,\ | |||||
int fE, int fI, int hev_thresh)\ | int fE, int fI, int hev_thresh)\ | ||||
{\ | {\ | ||||
vp8_ ## dir ## _loop_filter8_c(dstU, stride, fE, fI, hev_thresh);\ | vp8_ ## dir ## _loop_filter8_c(dstU, stride, fE, fI, hev_thresh);\ | ||||
vp8_ ## dir ## _loop_filter8_c(dstV, stride, fE, fI, hev_thresh);\ | vp8_ ## dir ## _loop_filter8_c(dstV, stride, fE, fI, hev_thresh);\ | ||||
}\ | }\ | ||||
static void vp8_ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, uint8_t *dstV, int stride,\ | |||||
static void vp8_ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride,\ | |||||
int fE, int fI, int hev_thresh)\ | int fE, int fI, int hev_thresh)\ | ||||
{\ | {\ | ||||
vp8_ ## dir ## _loop_filter8_inner_c(dstU, stride, fE, fI, hev_thresh);\ | vp8_ ## dir ## _loop_filter8_inner_c(dstU, stride, fE, fI, hev_thresh);\ | ||||
@@ -286,7 +286,7 @@ static void vp8_ ## dir ## _loop_filter8uv_inner_c(uint8_t *dstU, uint8_t *dstV, | |||||
UV_LOOP_FILTER(v, 1, stride) | UV_LOOP_FILTER(v, 1, stride) | ||||
UV_LOOP_FILTER(h, stride, 1) | UV_LOOP_FILTER(h, stride, 1) | ||||
static void vp8_v_loop_filter_simple_c(uint8_t *dst, int stride, int flim) | |||||
static void vp8_v_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim) | |||||
{ | { | ||||
int i; | int i; | ||||
@@ -295,7 +295,7 @@ static void vp8_v_loop_filter_simple_c(uint8_t *dst, int stride, int flim) | |||||
filter_common(dst+i, stride, 1); | filter_common(dst+i, stride, 1); | ||||
} | } | ||||
static void vp8_h_loop_filter_simple_c(uint8_t *dst, int stride, int flim) | |||||
static void vp8_h_loop_filter_simple_c(uint8_t *dst, ptrdiff_t stride, int flim) | |||||
{ | { | ||||
int i; | int i; | ||||
@@ -315,7 +315,7 @@ static const uint8_t subpel_filters[7][6] = { | |||||
}; | }; | ||||
#define PUT_PIXELS(WIDTH) \ | #define PUT_PIXELS(WIDTH) \ | ||||
static void put_vp8_pixels ## WIDTH ##_c(uint8_t *dst, int dststride, uint8_t *src, int srcstride, int h, int x, int y) { \ | |||||
static void put_vp8_pixels ## WIDTH ##_c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int x, int y) { \ | |||||
int i; \ | int i; \ | ||||
for (i = 0; i < h; i++, dst+= dststride, src+= srcstride) { \ | for (i = 0; i < h; i++, dst+= dststride, src+= srcstride) { \ | ||||
memcpy(dst, src, WIDTH); \ | memcpy(dst, src, WIDTH); \ | ||||
@@ -335,7 +335,7 @@ PUT_PIXELS(4) | |||||
F[3]*src[x+1*stride] - F[4]*src[x+2*stride] + 64) >> 7] | F[3]*src[x+1*stride] - F[4]*src[x+2*stride] + 64) >> 7] | ||||
#define VP8_EPEL_H(SIZE, TAPS) \ | #define VP8_EPEL_H(SIZE, TAPS) \ | ||||
static void put_vp8_epel ## SIZE ## _h ## TAPS ## _c(uint8_t *dst, int dststride, uint8_t *src, int srcstride, int h, int mx, int my) \ | |||||
static void put_vp8_epel ## SIZE ## _h ## TAPS ## _c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
const uint8_t *filter = subpel_filters[mx-1]; \ | const uint8_t *filter = subpel_filters[mx-1]; \ | ||||
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ | uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ | ||||
@@ -349,7 +349,7 @@ static void put_vp8_epel ## SIZE ## _h ## TAPS ## _c(uint8_t *dst, int dststride | |||||
} \ | } \ | ||||
} | } | ||||
#define VP8_EPEL_V(SIZE, TAPS) \ | #define VP8_EPEL_V(SIZE, TAPS) \ | ||||
static void put_vp8_epel ## SIZE ## _v ## TAPS ## _c(uint8_t *dst, int dststride, uint8_t *src, int srcstride, int h, int mx, int my) \ | |||||
static void put_vp8_epel ## SIZE ## _v ## TAPS ## _c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
const uint8_t *filter = subpel_filters[my-1]; \ | const uint8_t *filter = subpel_filters[my-1]; \ | ||||
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ | uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ | ||||
@@ -363,7 +363,7 @@ static void put_vp8_epel ## SIZE ## _v ## TAPS ## _c(uint8_t *dst, int dststride | |||||
} \ | } \ | ||||
} | } | ||||
#define VP8_EPEL_HV(SIZE, HTAPS, VTAPS) \ | #define VP8_EPEL_HV(SIZE, HTAPS, VTAPS) \ | ||||
static void put_vp8_epel ## SIZE ## _h ## HTAPS ## v ## VTAPS ## _c(uint8_t *dst, int dststride, uint8_t *src, int srcstride, int h, int mx, int my) \ | |||||
static void put_vp8_epel ## SIZE ## _h ## HTAPS ## v ## VTAPS ## _c(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
const uint8_t *filter = subpel_filters[mx-1]; \ | const uint8_t *filter = subpel_filters[mx-1]; \ | ||||
uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ | uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; \ | ||||
@@ -416,7 +416,7 @@ VP8_EPEL_HV(8, 6, 6) | |||||
VP8_EPEL_HV(4, 6, 6) | VP8_EPEL_HV(4, 6, 6) | ||||
#define VP8_BILINEAR(SIZE) \ | #define VP8_BILINEAR(SIZE) \ | ||||
static void put_vp8_bilinear ## SIZE ## _h_c(uint8_t *dst, int stride, uint8_t *src, int s2, int h, int mx, int my) \ | |||||
static void put_vp8_bilinear ## SIZE ## _h_c(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s2, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
int a = 8-mx, b = mx; \ | int a = 8-mx, b = mx; \ | ||||
int x, y; \ | int x, y; \ | ||||
@@ -428,7 +428,7 @@ static void put_vp8_bilinear ## SIZE ## _h_c(uint8_t *dst, int stride, uint8_t * | |||||
src += stride; \ | src += stride; \ | ||||
} \ | } \ | ||||
} \ | } \ | ||||
static void put_vp8_bilinear ## SIZE ## _v_c(uint8_t *dst, int stride, uint8_t *src, int s2, int h, int mx, int my) \ | |||||
static void put_vp8_bilinear ## SIZE ## _v_c(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s2, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
int c = 8-my, d = my; \ | int c = 8-my, d = my; \ | ||||
int x, y; \ | int x, y; \ | ||||
@@ -441,7 +441,7 @@ static void put_vp8_bilinear ## SIZE ## _v_c(uint8_t *dst, int stride, uint8_t * | |||||
} \ | } \ | ||||
} \ | } \ | ||||
\ | \ | ||||
static void put_vp8_bilinear ## SIZE ## _hv_c(uint8_t *dst, int stride, uint8_t *src, int s2, int h, int mx, int my) \ | |||||
static void put_vp8_bilinear ## SIZE ## _hv_c(uint8_t *dst, ptrdiff_t stride, uint8_t *src, ptrdiff_t s2, int h, int mx, int my) \ | |||||
{ \ | { \ | ||||
int a = 8-mx, b = mx; \ | int a = 8-mx, b = mx; \ | ||||
int c = 8-my, d = my; \ | int c = 8-my, d = my; \ | ||||
@@ -29,40 +29,44 @@ | |||||
#include "dsputil.h" | #include "dsputil.h" | ||||
typedef void (*vp8_mc_func)(uint8_t *dst/*align 8*/, int dstStride, | |||||
uint8_t *src/*align 1*/, int srcStride, | |||||
typedef void (*vp8_mc_func)(uint8_t *dst/*align 8*/, ptrdiff_t dstStride, | |||||
uint8_t *src/*align 1*/, ptrdiff_t srcStride, | |||||
int h, int x, int y); | int h, int x, int y); | ||||
typedef struct VP8DSPContext { | typedef struct VP8DSPContext { | ||||
void (*vp8_luma_dc_wht)(DCTELEM block[4][4][16], DCTELEM dc[16]); | void (*vp8_luma_dc_wht)(DCTELEM block[4][4][16], DCTELEM dc[16]); | ||||
void (*vp8_luma_dc_wht_dc)(DCTELEM block[4][4][16], DCTELEM dc[16]); | void (*vp8_luma_dc_wht_dc)(DCTELEM block[4][4][16], DCTELEM dc[16]); | ||||
void (*vp8_idct_add)(uint8_t *dst, DCTELEM block[16], int stride); | |||||
void (*vp8_idct_dc_add)(uint8_t *dst, DCTELEM block[16], int stride); | |||||
void (*vp8_idct_dc_add4y)(uint8_t *dst, DCTELEM block[4][16], int stride); | |||||
void (*vp8_idct_dc_add4uv)(uint8_t *dst, DCTELEM block[4][16], int stride); | |||||
void (*vp8_idct_add)(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride); | |||||
void (*vp8_idct_dc_add)(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride); | |||||
void (*vp8_idct_dc_add4y)(uint8_t *dst, DCTELEM block[4][16], | |||||
ptrdiff_t stride); | |||||
void (*vp8_idct_dc_add4uv)(uint8_t *dst, DCTELEM block[4][16], | |||||
ptrdiff_t stride); | |||||
// loop filter applied to edges between macroblocks | // loop filter applied to edges between macroblocks | ||||
void (*vp8_v_loop_filter16y)(uint8_t *dst, int stride, | |||||
void (*vp8_v_loop_filter16y)(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_h_loop_filter16y)(uint8_t *dst, int stride, | |||||
void (*vp8_h_loop_filter16y)(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_v_loop_filter8uv)(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
void (*vp8_v_loop_filter8uv)(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_h_loop_filter8uv)(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
void (*vp8_h_loop_filter8uv)(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
// loop filter applied to inner macroblock edges | // loop filter applied to inner macroblock edges | ||||
void (*vp8_v_loop_filter16y_inner)(uint8_t *dst, int stride, | |||||
void (*vp8_v_loop_filter16y_inner)(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_h_loop_filter16y_inner)(uint8_t *dst, int stride, | |||||
void (*vp8_h_loop_filter16y_inner)(uint8_t *dst, ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_v_loop_filter8uv_inner)(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
void (*vp8_v_loop_filter8uv_inner)(uint8_t *dstU, uint8_t *dstV, | |||||
ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_h_loop_filter8uv_inner)(uint8_t *dstU, uint8_t *dstV, int stride, | |||||
void (*vp8_h_loop_filter8uv_inner)(uint8_t *dstU, uint8_t *dstV, | |||||
ptrdiff_t stride, | |||||
int flim_E, int flim_I, int hev_thresh); | int flim_E, int flim_I, int hev_thresh); | ||||
void (*vp8_v_loop_filter_simple)(uint8_t *dst, int stride, int flim); | |||||
void (*vp8_h_loop_filter_simple)(uint8_t *dst, int stride, int flim); | |||||
void (*vp8_v_loop_filter_simple)(uint8_t *dst, ptrdiff_t stride, int flim); | |||||
void (*vp8_h_loop_filter_simple)(uint8_t *dst, ptrdiff_t stride, int flim); | |||||
/** | /** | ||||
* first dimension: width>>3, height is assumed equal to width | * first dimension: width>>3, height is assumed equal to width | ||||
@@ -76,9 +80,12 @@ typedef struct VP8DSPContext { | |||||
vp8_mc_func put_vp8_bilinear_pixels_tab[3][3][3]; | vp8_mc_func put_vp8_bilinear_pixels_tab[3][3][3]; | ||||
} VP8DSPContext; | } VP8DSPContext; | ||||
void ff_put_vp8_pixels16_c(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y); | |||||
void ff_put_vp8_pixels8_c(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y); | |||||
void ff_put_vp8_pixels4_c(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y); | |||||
void ff_put_vp8_pixels16_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride, | |||||
int h, int x, int y); | |||||
void ff_put_vp8_pixels8_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride, | |||||
int h, int x, int y); | |||||
void ff_put_vp8_pixels4_c(uint8_t *dst, uint8_t *src, ptrdiff_t stride, | |||||
int h, int x, int y); | |||||
void ff_vp8dsp_init(VP8DSPContext *c); | void ff_vp8dsp_init(VP8DSPContext *c); | ||||
void ff_vp8dsp_init_x86(VP8DSPContext *c); | void ff_vp8dsp_init_x86(VP8DSPContext *c); | ||||
@@ -124,7 +124,7 @@ typedef struct WMACodecContext { | |||||
/* output buffer for one frame and the last for IMDCT windowing */ | /* output buffer for one frame and the last for IMDCT windowing */ | ||||
DECLARE_ALIGNED(32, float, frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE * 2]; | DECLARE_ALIGNED(32, float, frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE * 2]; | ||||
/* last frame info */ | /* last frame info */ | ||||
uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4]; /* padding added */ | |||||
uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; /* padding added */ | |||||
int last_bitoffset; | int last_bitoffset; | ||||
int last_superframe_len; | int last_superframe_len; | ||||
float noise_table[NOISE_TAB_SIZE]; | float noise_table[NOISE_TAB_SIZE]; | ||||
@@ -863,6 +863,12 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, | |||||
if (s->use_bit_reservoir) { | if (s->use_bit_reservoir) { | ||||
bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3); | bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3); | ||||
if (bit_offset > get_bits_left(&s->gb)) { | |||||
av_log(avctx, AV_LOG_ERROR, | |||||
"Invalid last frame bit offset %d > buf size %d (%d)\n", | |||||
bit_offset, get_bits_left(&s->gb), buf_size); | |||||
goto fail; | |||||
} | |||||
if (s->last_superframe_len > 0) { | if (s->last_superframe_len > 0) { | ||||
// printf("skip=%d\n", s->last_bitoffset); | // printf("skip=%d\n", s->last_bitoffset); | ||||
@@ -879,9 +885,10 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, | |||||
if (len > 0) { | if (len > 0) { | ||||
*q++ = (get_bits)(&s->gb, len) << (8 - len); | *q++ = (get_bits)(&s->gb, len) << (8 - len); | ||||
} | } | ||||
memset(q, 0, FF_INPUT_BUFFER_PADDING_SIZE); | |||||
/* XXX: bit_offset bits into last frame */ | /* XXX: bit_offset bits into last frame */ | ||||
init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8); | |||||
init_get_bits(&s->gb, s->last_superframe, s->last_superframe_len * 8 + bit_offset); | |||||
/* skip unused bits */ | /* skip unused bits */ | ||||
if (s->last_bitoffset > 0) | if (s->last_bitoffset > 0) | ||||
skip_bits(&s->gb, s->last_bitoffset); | skip_bits(&s->gb, s->last_bitoffset); | ||||
@@ -895,9 +902,9 @@ static int wma_decode_superframe(AVCodecContext *avctx, void *data, | |||||
/* read each frame starting from bit_offset */ | /* read each frame starting from bit_offset */ | ||||
pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3; | pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3; | ||||
if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8) | |||||
if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8 || pos > buf_size * 8) | |||||
return AVERROR_INVALIDDATA; | return AVERROR_INVALIDDATA; | ||||
init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8); | |||||
init_get_bits(&s->gb, buf + (pos >> 3), (buf_size - (pos >> 3))*8); | |||||
len = pos & 7; | len = pos & 7; | ||||
if (len > 0) | if (len > 0) | ||||
skip_bits(&s->gb, len); | skip_bits(&s->gb, len); | ||||
@@ -64,7 +64,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
WNV1Context * const l = avctx->priv_data; | WNV1Context * const l = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&l->pic; | |||||
AVFrame * const p = &l->pic; | |||||
unsigned char *Y,*U,*V; | unsigned char *Y,*U,*V; | ||||
int i, j; | int i, j; | ||||
int prev_y = 0, prev_u = 0, prev_v = 0; | int prev_y = 0, prev_u = 0, prev_v = 0; | ||||
@@ -619,7 +619,7 @@ MC MC33 | |||||
%define PAD 12 | %define PAD 12 | ||||
%define COUNT 2 | %define COUNT 2 | ||||
%else | %else | ||||
%define PAD 0 | |||||
%define PAD 4 | |||||
%define COUNT 3 | %define COUNT 3 | ||||
%endif | %endif | ||||
put_hv%2_10_%1: | put_hv%2_10_%1: | ||||
@@ -29,98 +29,98 @@ | |||||
/* | /* | ||||
* MC functions | * MC functions | ||||
*/ | */ | ||||
extern void ff_put_vp8_epel4_h4_mmxext(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_h4_mmxext(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_h6_mmxext(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_h6_mmxext(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_v4_mmxext(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_v4_mmxext(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_v6_mmxext(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_v6_mmxext(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_h4_sse2 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_h4_sse2 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_h6_sse2 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_h6_sse2 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_v4_sse2 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_v4_sse2 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_v6_sse2 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_v6_sse2 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_h4_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_h4_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_h6_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_h6_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_v4_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_v4_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel4_v6_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel4_v6_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_h4_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_h4_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_h6_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_h6_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_v4_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_v4_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_epel8_v6_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_epel8_v6_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear4_h_mmxext(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear4_h_mmxext(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear8_h_sse2 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear8_h_sse2 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear4_h_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear4_h_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear8_h_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear8_h_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear4_v_mmxext(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear4_v_mmxext(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear8_v_sse2 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear8_v_sse2 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear4_v_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear4_v_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_bilinear8_v_ssse3 (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_bilinear8_v_ssse3 (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_pixels8_mmx (uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_pixels8_mmx (uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_pixels16_mmx(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_pixels16_mmx(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
extern void ff_put_vp8_pixels16_sse(uint8_t *dst, int dststride, | |||||
uint8_t *src, int srcstride, | |||||
extern void ff_put_vp8_pixels16_sse(uint8_t *dst, ptrdiff_t dststride, | |||||
uint8_t *src, ptrdiff_t srcstride, | |||||
int height, int mx, int my); | int height, int mx, int my); | ||||
#define TAP_W16(OPT, FILTERTYPE, TAPTYPE) \ | #define TAP_W16(OPT, FILTERTYPE, TAPTYPE) \ | ||||
static void ff_put_vp8_ ## FILTERTYPE ## 16_ ## TAPTYPE ## _ ## OPT( \ | static void ff_put_vp8_ ## FILTERTYPE ## 16_ ## TAPTYPE ## _ ## OPT( \ | ||||
uint8_t *dst, int dststride, uint8_t *src, \ | |||||
int srcstride, int height, int mx, int my) \ | |||||
uint8_t *dst, ptrdiff_t dststride, uint8_t *src, \ | |||||
ptrdiff_t srcstride, int height, int mx, int my) \ | |||||
{ \ | { \ | ||||
ff_put_vp8_ ## FILTERTYPE ## 8_ ## TAPTYPE ## _ ## OPT( \ | ff_put_vp8_ ## FILTERTYPE ## 8_ ## TAPTYPE ## _ ## OPT( \ | ||||
dst, dststride, src, srcstride, height, mx, my); \ | dst, dststride, src, srcstride, height, mx, my); \ | ||||
@@ -129,8 +129,8 @@ static void ff_put_vp8_ ## FILTERTYPE ## 16_ ## TAPTYPE ## _ ## OPT( \ | |||||
} | } | ||||
#define TAP_W8(OPT, FILTERTYPE, TAPTYPE) \ | #define TAP_W8(OPT, FILTERTYPE, TAPTYPE) \ | ||||
static void ff_put_vp8_ ## FILTERTYPE ## 8_ ## TAPTYPE ## _ ## OPT( \ | static void ff_put_vp8_ ## FILTERTYPE ## 8_ ## TAPTYPE ## _ ## OPT( \ | ||||
uint8_t *dst, int dststride, uint8_t *src, \ | |||||
int srcstride, int height, int mx, int my) \ | |||||
uint8_t *dst, ptrdiff_t dststride, uint8_t *src, \ | |||||
ptrdiff_t srcstride, int height, int mx, int my) \ | |||||
{ \ | { \ | ||||
ff_put_vp8_ ## FILTERTYPE ## 4_ ## TAPTYPE ## _ ## OPT( \ | ff_put_vp8_ ## FILTERTYPE ## 4_ ## TAPTYPE ## _ ## OPT( \ | ||||
dst, dststride, src, srcstride, height, mx, my); \ | dst, dststride, src, srcstride, height, mx, my); \ | ||||
@@ -138,6 +138,7 @@ static void ff_put_vp8_ ## FILTERTYPE ## 8_ ## TAPTYPE ## _ ## OPT( \ | |||||
dst + 4, dststride, src + 4, srcstride, height, mx, my); \ | dst + 4, dststride, src + 4, srcstride, height, mx, my); \ | ||||
} | } | ||||
#if ARCH_X86_32 | |||||
TAP_W8 (mmxext, epel, h4) | TAP_W8 (mmxext, epel, h4) | ||||
TAP_W8 (mmxext, epel, h6) | TAP_W8 (mmxext, epel, h6) | ||||
TAP_W16(mmxext, epel, h6) | TAP_W16(mmxext, epel, h6) | ||||
@@ -148,6 +149,7 @@ TAP_W8 (mmxext, bilinear, h) | |||||
TAP_W16(mmxext, bilinear, h) | TAP_W16(mmxext, bilinear, h) | ||||
TAP_W8 (mmxext, bilinear, v) | TAP_W8 (mmxext, bilinear, v) | ||||
TAP_W16(mmxext, bilinear, v) | TAP_W16(mmxext, bilinear, v) | ||||
#endif | |||||
TAP_W16(sse2, epel, h6) | TAP_W16(sse2, epel, h6) | ||||
TAP_W16(sse2, epel, v6) | TAP_W16(sse2, epel, v6) | ||||
@@ -161,8 +163,8 @@ TAP_W16(ssse3, bilinear, v) | |||||
#define HVTAP(OPT, ALIGN, TAPNUMX, TAPNUMY, SIZE, MAXHEIGHT) \ | #define HVTAP(OPT, ALIGN, TAPNUMX, TAPNUMY, SIZE, MAXHEIGHT) \ | ||||
static void ff_put_vp8_epel ## SIZE ## _h ## TAPNUMX ## v ## TAPNUMY ## _ ## OPT( \ | static void ff_put_vp8_epel ## SIZE ## _h ## TAPNUMX ## v ## TAPNUMY ## _ ## OPT( \ | ||||
uint8_t *dst, int dststride, uint8_t *src, \ | |||||
int srcstride, int height, int mx, int my) \ | |||||
uint8_t *dst, ptrdiff_t dststride, uint8_t *src, \ | |||||
ptrdiff_t srcstride, int height, int mx, int my) \ | |||||
{ \ | { \ | ||||
DECLARE_ALIGNED(ALIGN, uint8_t, tmp)[SIZE * (MAXHEIGHT + TAPNUMY - 1)]; \ | DECLARE_ALIGNED(ALIGN, uint8_t, tmp)[SIZE * (MAXHEIGHT + TAPNUMY - 1)]; \ | ||||
uint8_t *tmpptr = tmp + SIZE * (TAPNUMY / 2 - 1); \ | uint8_t *tmpptr = tmp + SIZE * (TAPNUMY / 2 - 1); \ | ||||
@@ -173,15 +175,21 @@ static void ff_put_vp8_epel ## SIZE ## _h ## TAPNUMX ## v ## TAPNUMY ## _ ## OPT | |||||
dst, dststride, tmpptr, SIZE, height, mx, my); \ | dst, dststride, tmpptr, SIZE, height, mx, my); \ | ||||
} | } | ||||
#if ARCH_X86_32 | |||||
#define HVTAPMMX(x, y) \ | #define HVTAPMMX(x, y) \ | ||||
HVTAP(mmxext, 8, x, y, 4, 8) \ | HVTAP(mmxext, 8, x, y, 4, 8) \ | ||||
HVTAP(mmxext, 8, x, y, 8, 16) | HVTAP(mmxext, 8, x, y, 8, 16) | ||||
HVTAP(mmxext, 8, 6, 6, 16, 16) | |||||
#else | |||||
#define HVTAPMMX(x, y) \ | |||||
HVTAP(mmxext, 8, x, y, 4, 8) | |||||
#endif | |||||
HVTAPMMX(4, 4) | HVTAPMMX(4, 4) | ||||
HVTAPMMX(4, 6) | HVTAPMMX(4, 6) | ||||
HVTAPMMX(6, 4) | HVTAPMMX(6, 4) | ||||
HVTAPMMX(6, 6) | HVTAPMMX(6, 6) | ||||
HVTAP(mmxext, 8, 6, 6, 16, 16) | |||||
#define HVTAPSSE2(x, y, w) \ | #define HVTAPSSE2(x, y, w) \ | ||||
HVTAP(sse2, 16, x, y, w, 16) \ | HVTAP(sse2, 16, x, y, w, 16) \ | ||||
@@ -200,8 +208,8 @@ HVTAP(ssse3, 16, 6, 6, 4, 8) | |||||
#define HVBILIN(OPT, ALIGN, SIZE, MAXHEIGHT) \ | #define HVBILIN(OPT, ALIGN, SIZE, MAXHEIGHT) \ | ||||
static void ff_put_vp8_bilinear ## SIZE ## _hv_ ## OPT( \ | static void ff_put_vp8_bilinear ## SIZE ## _hv_ ## OPT( \ | ||||
uint8_t *dst, int dststride, uint8_t *src, \ | |||||
int srcstride, int height, int mx, int my) \ | |||||
uint8_t *dst, ptrdiff_t dststride, uint8_t *src, \ | |||||
ptrdiff_t srcstride, int height, int mx, int my) \ | |||||
{ \ | { \ | ||||
DECLARE_ALIGNED(ALIGN, uint8_t, tmp)[SIZE * (MAXHEIGHT + 2)]; \ | DECLARE_ALIGNED(ALIGN, uint8_t, tmp)[SIZE * (MAXHEIGHT + 2)]; \ | ||||
ff_put_vp8_bilinear ## SIZE ## _h_ ## OPT( \ | ff_put_vp8_bilinear ## SIZE ## _h_ ## OPT( \ | ||||
@@ -211,43 +219,68 @@ static void ff_put_vp8_bilinear ## SIZE ## _hv_ ## OPT( \ | |||||
} | } | ||||
HVBILIN(mmxext, 8, 4, 8) | HVBILIN(mmxext, 8, 4, 8) | ||||
#if ARCH_X86_32 | |||||
HVBILIN(mmxext, 8, 8, 16) | HVBILIN(mmxext, 8, 8, 16) | ||||
HVBILIN(mmxext, 8, 16, 16) | HVBILIN(mmxext, 8, 16, 16) | ||||
#endif | |||||
HVBILIN(sse2, 8, 8, 16) | HVBILIN(sse2, 8, 8, 16) | ||||
HVBILIN(sse2, 8, 16, 16) | HVBILIN(sse2, 8, 16, 16) | ||||
HVBILIN(ssse3, 8, 4, 8) | HVBILIN(ssse3, 8, 4, 8) | ||||
HVBILIN(ssse3, 8, 8, 16) | HVBILIN(ssse3, 8, 8, 16) | ||||
HVBILIN(ssse3, 8, 16, 16) | HVBILIN(ssse3, 8, 16, 16) | ||||
extern void ff_vp8_idct_dc_add_mmx(uint8_t *dst, DCTELEM block[16], int stride); | |||||
extern void ff_vp8_idct_dc_add_sse4(uint8_t *dst, DCTELEM block[16], int stride); | |||||
extern void ff_vp8_idct_dc_add4y_mmx(uint8_t *dst, DCTELEM block[4][16], int stride); | |||||
extern void ff_vp8_idct_dc_add4y_sse2(uint8_t *dst, DCTELEM block[4][16], int stride); | |||||
extern void ff_vp8_idct_dc_add4uv_mmx(uint8_t *dst, DCTELEM block[2][16], int stride); | |||||
extern void ff_vp8_idct_dc_add_mmx(uint8_t *dst, DCTELEM block[16], | |||||
ptrdiff_t stride); | |||||
extern void ff_vp8_idct_dc_add_sse4(uint8_t *dst, DCTELEM block[16], | |||||
ptrdiff_t stride); | |||||
extern void ff_vp8_idct_dc_add4y_mmx(uint8_t *dst, DCTELEM block[4][16], | |||||
ptrdiff_t stride); | |||||
extern void ff_vp8_idct_dc_add4y_sse2(uint8_t *dst, DCTELEM block[4][16], | |||||
ptrdiff_t stride); | |||||
extern void ff_vp8_idct_dc_add4uv_mmx(uint8_t *dst, DCTELEM block[2][16], | |||||
ptrdiff_t stride); | |||||
extern void ff_vp8_luma_dc_wht_mmx(DCTELEM block[4][4][16], DCTELEM dc[16]); | extern void ff_vp8_luma_dc_wht_mmx(DCTELEM block[4][4][16], DCTELEM dc[16]); | ||||
extern void ff_vp8_luma_dc_wht_sse(DCTELEM block[4][4][16], DCTELEM dc[16]); | extern void ff_vp8_luma_dc_wht_sse(DCTELEM block[4][4][16], DCTELEM dc[16]); | ||||
extern void ff_vp8_idct_add_mmx(uint8_t *dst, DCTELEM block[16], int stride); | |||||
extern void ff_vp8_idct_add_sse(uint8_t *dst, DCTELEM block[16], int stride); | |||||
extern void ff_vp8_idct_add_mmx(uint8_t *dst, DCTELEM block[16], | |||||
ptrdiff_t stride); | |||||
extern void ff_vp8_idct_add_sse(uint8_t *dst, DCTELEM block[16], | |||||
ptrdiff_t stride); | |||||
#define DECLARE_LOOP_FILTER(NAME)\ | #define DECLARE_LOOP_FILTER(NAME)\ | ||||
extern void ff_vp8_v_loop_filter_simple_ ## NAME(uint8_t *dst, int stride, int flim);\ | |||||
extern void ff_vp8_h_loop_filter_simple_ ## NAME(uint8_t *dst, int stride, int flim);\ | |||||
extern void ff_vp8_v_loop_filter16y_inner_ ## NAME (uint8_t *dst, int stride,\ | |||||
extern void ff_vp8_v_loop_filter_simple_ ## NAME(uint8_t *dst, \ | |||||
ptrdiff_t stride, \ | |||||
int flim);\ | |||||
extern void ff_vp8_h_loop_filter_simple_ ## NAME(uint8_t *dst, \ | |||||
ptrdiff_t stride, \ | |||||
int flim);\ | |||||
extern void ff_vp8_v_loop_filter16y_inner_ ## NAME (uint8_t *dst, \ | |||||
ptrdiff_t stride,\ | |||||
int e, int i, int hvt);\ | |||||
extern void ff_vp8_h_loop_filter16y_inner_ ## NAME (uint8_t *dst, \ | |||||
ptrdiff_t stride,\ | |||||
int e, int i, int hvt);\ | |||||
extern void ff_vp8_v_loop_filter8uv_inner_ ## NAME (uint8_t *dstU, \ | |||||
uint8_t *dstV,\ | |||||
ptrdiff_t s, \ | |||||
int e, int i, int hvt);\ | |||||
extern void ff_vp8_h_loop_filter8uv_inner_ ## NAME (uint8_t *dstU, \ | |||||
uint8_t *dstV,\ | |||||
ptrdiff_t s, \ | |||||
int e, int i, int hvt);\ | int e, int i, int hvt);\ | ||||
extern void ff_vp8_h_loop_filter16y_inner_ ## NAME (uint8_t *dst, int stride,\ | |||||
extern void ff_vp8_v_loop_filter16y_mbedge_ ## NAME(uint8_t *dst, \ | |||||
ptrdiff_t stride,\ | |||||
int e, int i, int hvt);\ | int e, int i, int hvt);\ | ||||
extern void ff_vp8_v_loop_filter8uv_inner_ ## NAME (uint8_t *dstU, uint8_t *dstV,\ | |||||
int s, int e, int i, int hvt);\ | |||||
extern void ff_vp8_h_loop_filter8uv_inner_ ## NAME (uint8_t *dstU, uint8_t *dstV,\ | |||||
int s, int e, int i, int hvt);\ | |||||
extern void ff_vp8_v_loop_filter16y_mbedge_ ## NAME(uint8_t *dst, int stride,\ | |||||
extern void ff_vp8_h_loop_filter16y_mbedge_ ## NAME(uint8_t *dst, \ | |||||
ptrdiff_t stride,\ | |||||
int e, int i, int hvt);\ | int e, int i, int hvt);\ | ||||
extern void ff_vp8_h_loop_filter16y_mbedge_ ## NAME(uint8_t *dst, int stride,\ | |||||
extern void ff_vp8_v_loop_filter8uv_mbedge_ ## NAME(uint8_t *dstU, \ | |||||
uint8_t *dstV,\ | |||||
ptrdiff_t s, \ | |||||
int e, int i, int hvt);\ | int e, int i, int hvt);\ | ||||
extern void ff_vp8_v_loop_filter8uv_mbedge_ ## NAME(uint8_t *dstU, uint8_t *dstV,\ | |||||
int s, int e, int i, int hvt);\ | |||||
extern void ff_vp8_h_loop_filter8uv_mbedge_ ## NAME(uint8_t *dstU, uint8_t *dstV,\ | |||||
int s, int e, int i, int hvt); | |||||
extern void ff_vp8_h_loop_filter8uv_mbedge_ ## NAME(uint8_t *dstU, \ | |||||
uint8_t *dstV,\ | |||||
ptrdiff_t s, \ | |||||
int e, int i, int hvt); | |||||
DECLARE_LOOP_FILTER(mmx) | DECLARE_LOOP_FILTER(mmx) | ||||
DECLARE_LOOP_FILTER(mmxext) | DECLARE_LOOP_FILTER(mmxext) | ||||
@@ -288,15 +321,18 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c) | |||||
if (mm_flags & AV_CPU_FLAG_MMX) { | if (mm_flags & AV_CPU_FLAG_MMX) { | ||||
c->vp8_idct_dc_add = ff_vp8_idct_dc_add_mmx; | c->vp8_idct_dc_add = ff_vp8_idct_dc_add_mmx; | ||||
c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_mmx; | |||||
c->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmx; | c->vp8_idct_dc_add4uv = ff_vp8_idct_dc_add4uv_mmx; | ||||
#if ARCH_X86_32 | |||||
c->vp8_idct_dc_add4y = ff_vp8_idct_dc_add4y_mmx; | |||||
c->vp8_idct_add = ff_vp8_idct_add_mmx; | c->vp8_idct_add = ff_vp8_idct_add_mmx; | ||||
c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_mmx; | c->vp8_luma_dc_wht = ff_vp8_luma_dc_wht_mmx; | ||||
c->put_vp8_epel_pixels_tab[0][0][0] = | c->put_vp8_epel_pixels_tab[0][0][0] = | ||||
c->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_mmx; | c->put_vp8_bilinear_pixels_tab[0][0][0] = ff_put_vp8_pixels16_mmx; | ||||
#endif | |||||
c->put_vp8_epel_pixels_tab[1][0][0] = | c->put_vp8_epel_pixels_tab[1][0][0] = | ||||
c->put_vp8_bilinear_pixels_tab[1][0][0] = ff_put_vp8_pixels8_mmx; | c->put_vp8_bilinear_pixels_tab[1][0][0] = ff_put_vp8_pixels8_mmx; | ||||
#if ARCH_X86_32 | |||||
c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmx; | c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmx; | ||||
c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmx; | c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmx; | ||||
@@ -309,17 +345,19 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c) | |||||
c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmx; | c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmx; | ||||
c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmx; | c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmx; | ||||
c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmx; | c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmx; | ||||
#endif | |||||
} | } | ||||
/* note that 4-tap width=16 functions are missing because w=16 | /* note that 4-tap width=16 functions are missing because w=16 | ||||
* is only used for luma, and luma is always a copy or sixtap. */ | * is only used for luma, and luma is always a copy or sixtap. */ | ||||
if (mm_flags & AV_CPU_FLAG_MMX2) { | if (mm_flags & AV_CPU_FLAG_MMX2) { | ||||
VP8_MC_FUNC(2, 4, mmxext); | |||||
VP8_BILINEAR_MC_FUNC(2, 4, mmxext); | |||||
#if ARCH_X86_32 | |||||
VP8_LUMA_MC_FUNC(0, 16, mmxext); | VP8_LUMA_MC_FUNC(0, 16, mmxext); | ||||
VP8_MC_FUNC(1, 8, mmxext); | VP8_MC_FUNC(1, 8, mmxext); | ||||
VP8_MC_FUNC(2, 4, mmxext); | |||||
VP8_BILINEAR_MC_FUNC(0, 16, mmxext); | VP8_BILINEAR_MC_FUNC(0, 16, mmxext); | ||||
VP8_BILINEAR_MC_FUNC(1, 8, mmxext); | VP8_BILINEAR_MC_FUNC(1, 8, mmxext); | ||||
VP8_BILINEAR_MC_FUNC(2, 4, mmxext); | |||||
c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmxext; | c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_mmxext; | ||||
c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmxext; | c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_mmxext; | ||||
@@ -333,6 +371,7 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c) | |||||
c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmxext; | c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_mmxext; | ||||
c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmxext; | c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_mmxext; | ||||
c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmxext; | c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_mmxext; | ||||
#endif | |||||
} | } | ||||
if (mm_flags & AV_CPU_FLAG_SSE) { | if (mm_flags & AV_CPU_FLAG_SSE) { | ||||
@@ -865,6 +865,7 @@ cglobal put_vp8_pixels8_mmx, 5,5 | |||||
jg .nextrow | jg .nextrow | ||||
REP_RET | REP_RET | ||||
%if ARCH_X86_32 | |||||
cglobal put_vp8_pixels16_mmx, 5,5 | cglobal put_vp8_pixels16_mmx, 5,5 | ||||
.nextrow: | .nextrow: | ||||
movq mm0, [r2+r3*0+0] | movq mm0, [r2+r3*0+0] | ||||
@@ -880,6 +881,7 @@ cglobal put_vp8_pixels16_mmx, 5,5 | |||||
sub r4d, 2 | sub r4d, 2 | ||||
jg .nextrow | jg .nextrow | ||||
REP_RET | REP_RET | ||||
%endif | |||||
cglobal put_vp8_pixels16_sse, 5,5,2 | cglobal put_vp8_pixels16_sse, 5,5,2 | ||||
.nextrow: | .nextrow: | ||||
@@ -973,6 +975,7 @@ cglobal vp8_idct_dc_add_sse4, 3, 3, 6 | |||||
; void vp8_idct_dc_add4y_<opt>(uint8_t *dst, DCTELEM block[4][16], int stride); | ; void vp8_idct_dc_add4y_<opt>(uint8_t *dst, DCTELEM block[4][16], int stride); | ||||
;----------------------------------------------------------------------------- | ;----------------------------------------------------------------------------- | ||||
%if ARCH_X86_32 | |||||
INIT_MMX | INIT_MMX | ||||
cglobal vp8_idct_dc_add4y_mmx, 3, 3 | cglobal vp8_idct_dc_add4y_mmx, 3, 3 | ||||
; load data | ; load data | ||||
@@ -1007,6 +1010,7 @@ cglobal vp8_idct_dc_add4y_mmx, 3, 3 | |||||
ADD_DC m0, m6, 0, mova | ADD_DC m0, m6, 0, mova | ||||
ADD_DC m1, m7, 8, mova | ADD_DC m1, m7, 8, mova | ||||
RET | RET | ||||
%endif | |||||
INIT_XMM | INIT_XMM | ||||
cglobal vp8_idct_dc_add4y_sse2, 3, 3, 6 | cglobal vp8_idct_dc_add4y_sse2, 3, 3, 6 | ||||
@@ -1152,7 +1156,9 @@ cglobal vp8_idct_add_%1, 3, 3 | |||||
RET | RET | ||||
%endmacro | %endmacro | ||||
%if ARCH_X86_32 | |||||
VP8_IDCT_ADD mmx | VP8_IDCT_ADD mmx | ||||
%endif | |||||
VP8_IDCT_ADD sse | VP8_IDCT_ADD sse | ||||
;----------------------------------------------------------------------------- | ;----------------------------------------------------------------------------- | ||||
@@ -1217,7 +1223,9 @@ cglobal vp8_luma_dc_wht_%1, 2,3 | |||||
%endmacro | %endmacro | ||||
INIT_MMX | INIT_MMX | ||||
%if ARCH_X86_32 | |||||
VP8_DC_WHT mmx | VP8_DC_WHT mmx | ||||
%endif | |||||
VP8_DC_WHT sse | VP8_DC_WHT sse | ||||
;----------------------------------------------------------------------------- | ;----------------------------------------------------------------------------- | ||||
@@ -1610,6 +1618,7 @@ cglobal vp8_%2_loop_filter_simple_%1, 3, %3, %4 | |||||
%endif | %endif | ||||
%endmacro | %endmacro | ||||
%if ARCH_X86_32 | |||||
INIT_MMX | INIT_MMX | ||||
%define SPLATB_REG SPLATB_REG_MMX | %define SPLATB_REG SPLATB_REG_MMX | ||||
SIMPLE_LOOPFILTER mmx, v, 4, 0 | SIMPLE_LOOPFILTER mmx, v, 4, 0 | ||||
@@ -1617,6 +1626,8 @@ SIMPLE_LOOPFILTER mmx, h, 5, 0 | |||||
%define SPLATB_REG SPLATB_REG_MMXEXT | %define SPLATB_REG SPLATB_REG_MMXEXT | ||||
SIMPLE_LOOPFILTER mmxext, v, 4, 0 | SIMPLE_LOOPFILTER mmxext, v, 4, 0 | ||||
SIMPLE_LOOPFILTER mmxext, h, 5, 0 | SIMPLE_LOOPFILTER mmxext, h, 5, 0 | ||||
%endif | |||||
INIT_XMM | INIT_XMM | ||||
%define SPLATB_REG SPLATB_REG_SSE2 | %define SPLATB_REG SPLATB_REG_SSE2 | ||||
%define WRITE_8W WRITE_8W_SSE2 | %define WRITE_8W WRITE_8W_SSE2 | ||||
@@ -2118,6 +2129,7 @@ cglobal vp8_%2_loop_filter16y_inner_%1, 5, %3, %5 | |||||
RET | RET | ||||
%endmacro | %endmacro | ||||
%if ARCH_X86_32 | |||||
INIT_MMX | INIT_MMX | ||||
%define SPLATB_REG SPLATB_REG_MMX | %define SPLATB_REG SPLATB_REG_MMX | ||||
INNER_LOOPFILTER mmx, v, 6, 16, 0 | INNER_LOOPFILTER mmx, v, 6, 16, 0 | ||||
@@ -2130,6 +2142,7 @@ INNER_LOOPFILTER mmxext, v, 6, 16, 0 | |||||
INNER_LOOPFILTER mmxext, h, 6, 16, 0 | INNER_LOOPFILTER mmxext, h, 6, 16, 0 | ||||
INNER_LOOPFILTER mmxext, v, 6, 8, 0 | INNER_LOOPFILTER mmxext, v, 6, 8, 0 | ||||
INNER_LOOPFILTER mmxext, h, 6, 8, 0 | INNER_LOOPFILTER mmxext, h, 6, 8, 0 | ||||
%endif | |||||
INIT_XMM | INIT_XMM | ||||
%define SPLATB_REG SPLATB_REG_SSE2 | %define SPLATB_REG SPLATB_REG_SSE2 | ||||
@@ -2814,6 +2827,7 @@ cglobal vp8_%2_loop_filter16y_mbedge_%1, 5, %3, %5 | |||||
RET | RET | ||||
%endmacro | %endmacro | ||||
%if ARCH_X86_32 | |||||
INIT_MMX | INIT_MMX | ||||
%define SPLATB_REG SPLATB_REG_MMX | %define SPLATB_REG SPLATB_REG_MMX | ||||
MBEDGE_LOOPFILTER mmx, v, 6, 16, 0 | MBEDGE_LOOPFILTER mmx, v, 6, 16, 0 | ||||
@@ -2826,6 +2840,7 @@ MBEDGE_LOOPFILTER mmxext, v, 6, 16, 0 | |||||
MBEDGE_LOOPFILTER mmxext, h, 6, 16, 0 | MBEDGE_LOOPFILTER mmxext, h, 6, 16, 0 | ||||
MBEDGE_LOOPFILTER mmxext, v, 6, 8, 0 | MBEDGE_LOOPFILTER mmxext, v, 6, 8, 0 | ||||
MBEDGE_LOOPFILTER mmxext, h, 6, 8, 0 | MBEDGE_LOOPFILTER mmxext, h, 6, 8, 0 | ||||
%endif | |||||
INIT_XMM | INIT_XMM | ||||
%define SPLATB_REG SPLATB_REG_SSE2 | %define SPLATB_REG SPLATB_REG_SSE2 | ||||
@@ -45,7 +45,7 @@ static int decode_frame(AVCodecContext *avctx, | |||||
const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
VideoXLContext * const a = avctx->priv_data; | VideoXLContext * const a = avctx->priv_data; | ||||
AVFrame * const p= (AVFrame*)&a->pic; | |||||
AVFrame * const p = &a->pic; | |||||
uint8_t *Y, *U, *V; | uint8_t *Y, *U, *V; | ||||
int i, j; | int i, j; | ||||
int stride; | int stride; | ||||
@@ -313,7 +313,7 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
return -1; | return -1; | ||||
} | } | ||||
avctx->coded_frame = (AVFrame*)&c->pic; | |||||
avctx->coded_frame = &c->pic; | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -188,8 +188,8 @@ static int avs_read_packet(AVFormatContext * s, AVPacket * pkt) | |||||
avs->st_video->codec->height = avs->height; | avs->st_video->codec->height = avs->height; | ||||
avs->st_video->codec->bits_per_coded_sample=avs->bits_per_sample; | avs->st_video->codec->bits_per_coded_sample=avs->bits_per_sample; | ||||
avs->st_video->nb_frames = avs->nb_frames; | avs->st_video->nb_frames = avs->nb_frames; | ||||
avs->st_video->codec->time_base = (AVRational) { | |||||
1, avs->fps}; | |||||
avs->st_video->r_frame_rate = avs->st_video->avg_frame_rate = | |||||
(AVRational){avs->fps, 1}; | |||||
} | } | ||||
return avs_read_video_packet(s, pkt, type, sub_type, size, | return avs_read_video_packet(s, pkt, type, sub_type, size, | ||||
palette, palette_size); | palette, palette_size); | ||||
@@ -283,6 +283,20 @@ static int process_video_header_vp6(AVFormatContext *s) | |||||
return 1; | return 1; | ||||
} | } | ||||
static int process_video_header_cmv(AVFormatContext *s) | |||||
{ | |||||
EaDemuxContext *ea = s->priv_data; | |||||
int fps; | |||||
avio_skip(s->pb, 10); | |||||
fps = avio_rl16(s->pb); | |||||
if (fps) | |||||
ea->time_base = (AVRational){1, fps}; | |||||
ea->video_codec = CODEC_ID_CMV; | |||||
return 0; | |||||
} | |||||
/* | /* | ||||
* Process EA file header | * Process EA file header | ||||
* Returns 1 if the EA file is valid and successfully opened, 0 otherwise | * Returns 1 if the EA file is valid and successfully opened, 0 otherwise | ||||
@@ -330,7 +344,7 @@ static int process_ea_header(AVFormatContext *s) { | |||||
break; | break; | ||||
case MVIh_TAG : | case MVIh_TAG : | ||||
ea->video_codec = CODEC_ID_CMV; | |||||
err = process_video_header_cmv(s); | |||||
break; | break; | ||||
case kVGT_TAG: | case kVGT_TAG: | ||||
@@ -418,10 +432,12 @@ static int ea_read_header(AVFormatContext *s) | |||||
if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) | if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO) | ||||
st->need_parsing = AVSTREAM_PARSE_HEADERS; | st->need_parsing = AVSTREAM_PARSE_HEADERS; | ||||
st->codec->codec_tag = 0; /* no fourcc */ | st->codec->codec_tag = 0; /* no fourcc */ | ||||
if (ea->time_base.num) | |||||
avpriv_set_pts_info(st, 64, ea->time_base.num, ea->time_base.den); | |||||
st->codec->width = ea->width; | st->codec->width = ea->width; | ||||
st->codec->height = ea->height; | st->codec->height = ea->height; | ||||
if (ea->time_base.num) | |||||
avpriv_set_pts_info(st, 64, ea->time_base.num, ea->time_base.den); | |||||
st->r_frame_rate = st->avg_frame_rate = (AVRational){ea->time_base.den, | |||||
ea->time_base.num}; | |||||
} | } | ||||
if (ea->audio_codec) { | if (ea->audio_codec) { | ||||
@@ -1921,15 +1921,31 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, | |||||
if (!track->audio.pkt_cnt) { | if (!track->audio.pkt_cnt) { | ||||
if (track->audio.sub_packet_cnt == 0) | if (track->audio.sub_packet_cnt == 0) | ||||
track->audio.buf_timecode = timecode; | track->audio.buf_timecode = timecode; | ||||
if (st->codec->codec_id == CODEC_ID_RA_288) | |||||
if (st->codec->codec_id == CODEC_ID_RA_288) { | |||||
if (size < cfs * h / 2) { | |||||
av_log(matroska->ctx, AV_LOG_ERROR, | |||||
"Corrupt int4 RM-style audio packet size\n"); | |||||
return AVERROR_INVALIDDATA; | |||||
} | |||||
for (x=0; x<h/2; x++) | for (x=0; x<h/2; x++) | ||||
memcpy(track->audio.buf+x*2*w+y*cfs, | memcpy(track->audio.buf+x*2*w+y*cfs, | ||||
data+x*cfs, cfs); | data+x*cfs, cfs); | ||||
else if (st->codec->codec_id == CODEC_ID_SIPR) | |||||
} else if (st->codec->codec_id == CODEC_ID_SIPR) { | |||||
if (size < w) { | |||||
av_log(matroska->ctx, AV_LOG_ERROR, | |||||
"Corrupt sipr RM-style audio packet size\n"); | |||||
return AVERROR_INVALIDDATA; | |||||
} | |||||
memcpy(track->audio.buf + y*w, data, w); | memcpy(track->audio.buf + y*w, data, w); | ||||
else | |||||
} else { | |||||
if (size < sps * w / sps) { | |||||
av_log(matroska->ctx, AV_LOG_ERROR, | |||||
"Corrupt generic RM-style audio packet size\n"); | |||||
return AVERROR_INVALIDDATA; | |||||
} | |||||
for (x=0; x<w/sps; x++) | for (x=0; x<w/sps; x++) | ||||
memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps); | memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps); | ||||
} | |||||
if (++track->audio.sub_packet_cnt >= h) { | if (++track->audio.sub_packet_cnt >= h) { | ||||
if (st->codec->codec_id == CODEC_ID_SIPR) | if (st->codec->codec_id == CODEC_ID_SIPR) | ||||
@@ -84,9 +84,7 @@ ogm_header(AVFormatContext *s, int idx) | |||||
if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){ | if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO){ | ||||
st->codec->width = bytestream_get_le32(&p); | st->codec->width = bytestream_get_le32(&p); | ||||
st->codec->height = bytestream_get_le32(&p); | st->codec->height = bytestream_get_le32(&p); | ||||
st->codec->time_base.den = spu * 10000000; | |||||
st->codec->time_base.num = time_unit; | |||||
avpriv_set_pts_info(st, 64, st->codec->time_base.num, st->codec->time_base.den); | |||||
avpriv_set_pts_info(st, 64, spu * 10000000, time_unit); | |||||
} else { | } else { | ||||
st->codec->channels = bytestream_get_le16(&p); | st->codec->channels = bytestream_get_le16(&p); | ||||
p += 2; /* block_align */ | p += 2; /* block_align */ | ||||
@@ -132,8 +130,7 @@ ogm_dshow_header(AVFormatContext *s, int idx) | |||||
if(t == 0x05589f80){ | if(t == 0x05589f80){ | ||||
st->codec->codec_type = AVMEDIA_TYPE_VIDEO; | st->codec->codec_type = AVMEDIA_TYPE_VIDEO; | ||||
st->codec->codec_id = ff_codec_get_id(ff_codec_bmp_tags, AV_RL32(p + 68)); | st->codec->codec_id = ff_codec_get_id(ff_codec_bmp_tags, AV_RL32(p + 68)); | ||||
st->codec->time_base.den = 10000000; | |||||
st->codec->time_base.num = AV_RL64(p + 164); | |||||
avpriv_set_pts_info(st, 64, AV_RL64(p + 164), 10000000); | |||||
st->codec->width = AV_RL32(p + 176); | st->codec->width = AV_RL32(p + 176); | ||||
st->codec->height = AV_RL32(p + 180); | st->codec->height = AV_RL32(p + 180); | ||||
} else if(t == 0x05589f81){ | } else if(t == 0x05589f81){ | ||||
@@ -56,6 +56,7 @@ theora_header (AVFormatContext * s, int idx) | |||||
if (os->buf[os->pstart] == 0x80) { | if (os->buf[os->pstart] == 0x80) { | ||||
GetBitContext gb; | GetBitContext gb; | ||||
int width, height; | int width, height; | ||||
AVRational timebase; | |||||
init_get_bits(&gb, os->buf + os->pstart, os->psize*8); | init_get_bits(&gb, os->buf + os->pstart, os->psize*8); | ||||
@@ -85,14 +86,14 @@ theora_header (AVFormatContext * s, int idx) | |||||
skip_bits(&gb, 16); | skip_bits(&gb, 16); | ||||
} | } | ||||
st->codec->time_base.den = get_bits_long(&gb, 32); | |||||
st->codec->time_base.num = get_bits_long(&gb, 32); | |||||
if (!(st->codec->time_base.num > 0 && st->codec->time_base.den > 0)) { | |||||
timebase.den = get_bits_long(&gb, 32); | |||||
timebase.num = get_bits_long(&gb, 32); | |||||
if (!(timebase.num > 0 && timebase.den > 0)) { | |||||
av_log(s, AV_LOG_WARNING, "Invalid time base in theora stream, assuming 25 FPS\n"); | av_log(s, AV_LOG_WARNING, "Invalid time base in theora stream, assuming 25 FPS\n"); | ||||
st->codec->time_base.num = 1; | |||||
st->codec->time_base.den = 25; | |||||
timebase.num = 1; | |||||
timebase.den = 25; | |||||
} | } | ||||
avpriv_set_pts_info(st, 64, st->codec->time_base.num, st->codec->time_base.den); | |||||
avpriv_set_pts_info(st, 64, timebase.num, timebase.den); | |||||
st->sample_aspect_ratio.num = get_bits_long(&gb, 24); | st->sample_aspect_ratio.num = get_bits_long(&gb, 24); | ||||
st->sample_aspect_ratio.den = get_bits_long(&gb, 24); | st->sample_aspect_ratio.den = get_bits_long(&gb, 24); | ||||
@@ -57,6 +57,7 @@ static int r3d_read_red1(AVFormatContext *s) | |||||
char filename[258]; | char filename[258]; | ||||
int tmp; | int tmp; | ||||
int av_unused tmp2; | int av_unused tmp2; | ||||
AVRational framerate; | |||||
if (!st) | if (!st) | ||||
return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
@@ -84,8 +85,10 @@ static int r3d_read_red1(AVFormatContext *s) | |||||
tmp = avio_rb16(s->pb); // unknown | tmp = avio_rb16(s->pb); // unknown | ||||
av_dlog(s, "unknown2 %d\n", tmp); | av_dlog(s, "unknown2 %d\n", tmp); | ||||
st->codec->time_base.den = avio_rb16(s->pb); | |||||
st->codec->time_base.num = avio_rb16(s->pb); | |||||
framerate.num = avio_rb16(s->pb); | |||||
framerate.den = avio_rb16(s->pb); | |||||
if (framerate.num && framerate.den) | |||||
st->r_frame_rate = st->avg_frame_rate = framerate; | |||||
tmp = avio_r8(s->pb); // audio channels | tmp = avio_r8(s->pb); // audio channels | ||||
av_dlog(s, "audio channels %d\n", tmp); | av_dlog(s, "audio channels %d\n", tmp); | ||||
@@ -107,7 +110,7 @@ static int r3d_read_red1(AVFormatContext *s) | |||||
av_dlog(s, "resolution %dx%d\n", st->codec->width, st->codec->height); | av_dlog(s, "resolution %dx%d\n", st->codec->width, st->codec->height); | ||||
av_dlog(s, "timescale %d\n", st->time_base.den); | av_dlog(s, "timescale %d\n", st->time_base.den); | ||||
av_dlog(s, "frame rate %d/%d\n", | av_dlog(s, "frame rate %d/%d\n", | ||||
st->codec->time_base.num, st->codec->time_base.den); | |||||
framerate.num, framerate.den); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -132,9 +135,11 @@ static int r3d_read_rdvo(AVFormatContext *s, Atom *atom) | |||||
av_dlog(s, "video offset %d: %#x\n", i, r3d->video_offsets[i]); | av_dlog(s, "video offset %d: %#x\n", i, r3d->video_offsets[i]); | ||||
} | } | ||||
if (st->codec->time_base.den) | |||||
st->duration = (uint64_t)r3d->video_offsets_count* | |||||
st->time_base.den*st->codec->time_base.num/st->codec->time_base.den; | |||||
if (st->r_frame_rate.num) | |||||
st->duration = av_rescale_q(r3d->video_offsets_count, | |||||
(AVRational){st->r_frame_rate.den, | |||||
st->r_frame_rate.num}, | |||||
st->time_base); | |||||
av_dlog(s, "duration %"PRId64"\n", st->duration); | av_dlog(s, "duration %"PRId64"\n", st->duration); | ||||
return 0; | return 0; | ||||
@@ -257,9 +262,9 @@ static int r3d_read_redv(AVFormatContext *s, AVPacket *pkt, Atom *atom) | |||||
pkt->stream_index = 0; | pkt->stream_index = 0; | ||||
pkt->dts = dts; | pkt->dts = dts; | ||||
if (st->codec->time_base.den) | |||||
if (st->r_frame_rate.num) | |||||
pkt->duration = (uint64_t)st->time_base.den* | pkt->duration = (uint64_t)st->time_base.den* | ||||
st->codec->time_base.num/st->codec->time_base.den; | |||||
st->r_frame_rate.den/st->r_frame_rate.num; | |||||
av_dlog(s, "pkt dts %"PRId64" duration %d\n", pkt->dts, pkt->duration); | av_dlog(s, "pkt dts %"PRId64" duration %d\n", pkt->dts, pkt->duration); | ||||
return 0; | return 0; | ||||
@@ -357,11 +362,11 @@ static int r3d_seek(AVFormatContext *s, int stream_index, int64_t sample_time, i | |||||
R3DContext *r3d = s->priv_data; | R3DContext *r3d = s->priv_data; | ||||
int frame_num; | int frame_num; | ||||
if (!st->codec->time_base.num || !st->time_base.den) | |||||
if (!st->r_frame_rate.num) | |||||
return -1; | return -1; | ||||
frame_num = sample_time*st->codec->time_base.den/ | |||||
((int64_t)st->codec->time_base.num*st->time_base.den); | |||||
frame_num = av_rescale_q(sample_time, st->time_base, | |||||
(AVRational){st->r_frame_rate.den, st->r_frame_rate.num}); | |||||
av_dlog(s, "seek frame num %d timestamp %"PRId64"\n", | av_dlog(s, "seek frame num %d timestamp %"PRId64"\n", | ||||
frame_num, sample_time); | frame_num, sample_time); | ||||
@@ -439,10 +439,8 @@ static int rm_read_header(AVFormatContext *s) | |||||
return AVERROR(EIO); | return AVERROR(EIO); | ||||
} | } | ||||
avio_rb32(pb); /* header size */ | |||||
avio_rb16(pb); | |||||
avio_rb32(pb); | |||||
avio_rb32(pb); /* number of headers */ | |||||
tag_size = avio_rb32(pb); | |||||
avio_skip(pb, tag_size - 8); | |||||
for(;;) { | for(;;) { | ||||
if (url_feof(pb)) | if (url_feof(pb)) | ||||
@@ -1,4 +1,4 @@ | |||||
b813a52d4efe6cf7974190ea9c4c7e8c *./tests/data/acodec/g722.wav | |||||
d1a10c4d35f752f60798114a156be3a8 *./tests/data/acodec/g722.wav | |||||
48053 ./tests/data/acodec/g722.wav | 48053 ./tests/data/acodec/g722.wav | ||||
d8344d14a11eef0418b856af70694cbe *./tests/data/g722.acodec.out.wav | |||||
stddev: 8841.18 PSNR: 17.40 MAXDIFF:36225 bytes: 191980/ 1058400 | |||||
8dafe5b74ccd5f08fed2fb2a69c5475f *./tests/data/g722.acodec.out.wav | |||||
stddev: 8939.47 PSNR: 17.30 MAXDIFF:40370 bytes: 191980/ 1058400 |
@@ -1,168 +1,168 @@ | |||||
#tb 0: 1/16000 | #tb 0: 1/16000 | ||||
0, 0, 0, 2048, 4096, 0xde68394d | |||||
0, 2048, 2048, 2048, 4096, 0xa5c28cb7 | |||||
0, 4096, 4096, 2048, 4096, 0x2e3c2f23 | |||||
0, 6144, 6144, 2048, 4096, 0xd7757825 | |||||
0, 8192, 8192, 2048, 4096, 0xafd1fd61 | |||||
0, 10240, 10240, 2048, 4096, 0x686afcbe | |||||
0, 12288, 12288, 2048, 4096, 0x2290e848 | |||||
0, 14336, 14336, 2048, 4096, 0xddd484ad | |||||
0, 16384, 16384, 2048, 4096, 0x148811a6 | |||||
0, 18432, 18432, 2048, 4096, 0x8b965613 | |||||
0, 20480, 20480, 2048, 4096, 0x8b095d51 | |||||
0, 22528, 22528, 2048, 4096, 0xf7625485 | |||||
0, 24576, 24576, 2048, 4096, 0x982a688c | |||||
0, 26624, 26624, 2048, 4096, 0xc290dcfc | |||||
0, 28672, 28672, 2048, 4096, 0x8bdef225 | |||||
0, 30720, 30720, 2048, 4096, 0xfca27fdc | |||||
0, 32768, 32768, 2048, 4096, 0x95eff313 | |||||
0, 34816, 34816, 2048, 4096, 0x691ed4f7 | |||||
0, 36864, 36864, 2048, 4096, 0xd7e7b492 | |||||
0, 38912, 38912, 2048, 4096, 0xb0416bfe | |||||
0, 40960, 40960, 2048, 4096, 0xf94b3ebd | |||||
0, 43008, 43008, 2048, 4096, 0x7f73ca12 | |||||
0, 45056, 45056, 2048, 4096, 0xe91da4a3 | |||||
0, 47104, 47104, 2048, 4096, 0x1f74dc0e | |||||
0, 49152, 49152, 2048, 4096, 0xd95b35e8 | |||||
0, 51200, 51200, 2048, 4096, 0x6dcdde1a | |||||
0, 53248, 53248, 2048, 4096, 0x614fd4e4 | |||||
0, 55296, 55296, 2048, 4096, 0xe38d0fd5 | |||||
0, 57344, 57344, 2048, 4096, 0xfeba2999 | |||||
0, 59392, 59392, 2048, 4096, 0x1bf541e1 | |||||
0, 61440, 61440, 2048, 4096, 0x689f50d8 | |||||
0, 63488, 63488, 2048, 4096, 0x0aa60f5f | |||||
0, 65536, 65536, 2048, 4096, 0x60ac3116 | |||||
0, 67584, 67584, 2048, 4096, 0xfa60e5e6 | |||||
0, 69632, 69632, 2048, 4096, 0xc7207c5b | |||||
0, 71680, 71680, 2048, 4096, 0x01196277 | |||||
0, 73728, 73728, 2048, 4096, 0x609ca46c | |||||
0, 75776, 75776, 2048, 4096, 0xfb799142 | |||||
0, 77824, 77824, 2048, 4096, 0x720910df | |||||
0, 79872, 79872, 2048, 4096, 0xe21a8662 | |||||
0, 81920, 81920, 2048, 4096, 0x07105120 | |||||
0, 83968, 83968, 2048, 4096, 0x593f627e | |||||
0, 86016, 86016, 2048, 4096, 0x28ddc80c | |||||
0, 88064, 88064, 2048, 4096, 0xc69ef356 | |||||
0, 90112, 90112, 2048, 4096, 0x2defc5bd | |||||
0, 92160, 92160, 2048, 4096, 0x82a4f418 | |||||
0, 94208, 94208, 2048, 4096, 0x424cb997 | |||||
0, 96256, 96256, 2048, 4096, 0x167a49b7 | |||||
0, 98304, 98304, 2048, 4096, 0x32a3e0d4 | |||||
0, 100352, 100352, 2048, 4096, 0x08a353ae | |||||
0, 102400, 102400, 2048, 4096, 0x9543577b | |||||
0, 104448, 104448, 2048, 4096, 0x2ed137cf | |||||
0, 106496, 106496, 2048, 4096, 0xd80b0538 | |||||
0, 108544, 108544, 2048, 4096, 0x2ad31bef | |||||
0, 110592, 110592, 2048, 4096, 0x1060cff8 | |||||
0, 112640, 112640, 2048, 4096, 0x76ab5ab8 | |||||
0, 114688, 114688, 2048, 4096, 0x8eedb68d | |||||
0, 116736, 116736, 2048, 4096, 0xf4e2dc46 | |||||
0, 118784, 118784, 2048, 4096, 0xc52d3326 | |||||
0, 120832, 120832, 2048, 4096, 0x25201a26 | |||||
0, 122880, 122880, 2048, 4096, 0x16419378 | |||||
0, 124928, 124928, 2048, 4096, 0x97061f3c | |||||
0, 126976, 126976, 2048, 4096, 0xd54edecd | |||||
0, 129024, 129024, 2048, 4096, 0xc830b07b | |||||
0, 131072, 131072, 2048, 4096, 0x804bae00 | |||||
0, 133120, 133120, 2048, 4096, 0xbb279150 | |||||
0, 135168, 135168, 2048, 4096, 0x95c4d5aa | |||||
0, 137216, 137216, 2048, 4096, 0xc51d5259 | |||||
0, 139264, 139264, 2048, 4096, 0x856e1ab0 | |||||
0, 141312, 141312, 2048, 4096, 0x9e6ccb12 | |||||
0, 143360, 143360, 2048, 4096, 0xa2e5c1bb | |||||
0, 145408, 145408, 2048, 4096, 0xe62fb62f | |||||
0, 147456, 147456, 2048, 4096, 0xf10e3df0 | |||||
0, 149504, 149504, 2048, 4096, 0x76def18b | |||||
0, 151552, 151552, 2048, 4096, 0xc9c3a26d | |||||
0, 153600, 153600, 2048, 4096, 0x8ec0e061 | |||||
0, 155648, 155648, 2048, 4096, 0x3d4e8512 | |||||
0, 157696, 157696, 2048, 4096, 0xec45cd46 | |||||
0, 159744, 159744, 2048, 4096, 0xa34f3ddf | |||||
0, 161792, 161792, 2048, 4096, 0x52b81c53 | |||||
0, 163840, 163840, 2048, 4096, 0xd0f0397a | |||||
0, 165888, 165888, 2048, 4096, 0x7c0de231 | |||||
0, 167936, 167936, 2048, 4096, 0xfe86c032 | |||||
0, 169984, 169984, 2048, 4096, 0x67cdb848 | |||||
0, 172032, 172032, 2048, 4096, 0x90532cc0 | |||||
0, 174080, 174080, 2048, 4096, 0x03bca9e9 | |||||
0, 176128, 176128, 2048, 4096, 0x73169fd1 | |||||
0, 178176, 178176, 2048, 4096, 0x0b93967d | |||||
0, 180224, 180224, 2048, 4096, 0x6486d8be | |||||
0, 182272, 182272, 2048, 4096, 0x555cc2ac | |||||
0, 184320, 184320, 2048, 4096, 0x07c1912e | |||||
0, 186368, 186368, 2048, 4096, 0xe0423c66 | |||||
0, 188416, 188416, 2048, 4096, 0xc12d0fa1 | |||||
0, 190464, 190464, 2048, 4096, 0xdf497c2f | |||||
0, 192512, 192512, 2048, 4096, 0x9298d1ba | |||||
0, 194560, 194560, 2048, 4096, 0x691a4e15 | |||||
0, 196608, 196608, 2048, 4096, 0x725adc6e | |||||
0, 198656, 198656, 2048, 4096, 0xf68e88de | |||||
0, 200704, 200704, 2048, 4096, 0x37a234aa | |||||
0, 202752, 202752, 2048, 4096, 0x43fb0558 | |||||
0, 204800, 204800, 2048, 4096, 0x653e4320 | |||||
0, 206848, 206848, 2048, 4096, 0x651e2f13 | |||||
0, 208896, 208896, 2048, 4096, 0x179049f9 | |||||
0, 210944, 210944, 2048, 4096, 0xe02fbb9d | |||||
0, 212992, 212992, 2048, 4096, 0xb7e9f2a0 | |||||
0, 215040, 215040, 2048, 4096, 0x94ee81df | |||||
0, 217088, 217088, 2048, 4096, 0x398a98de | |||||
0, 219136, 219136, 2048, 4096, 0x1267594a | |||||
0, 221184, 221184, 2048, 4096, 0x715adbaf | |||||
0, 223232, 223232, 2048, 4096, 0x28ce1a20 | |||||
0, 225280, 225280, 2048, 4096, 0x4f8073d0 | |||||
0, 227328, 227328, 2048, 4096, 0x536846d3 | |||||
0, 229376, 229376, 2048, 4096, 0x7dc7defe | |||||
0, 231424, 231424, 2048, 4096, 0x08a28e2a | |||||
0, 233472, 233472, 2048, 4096, 0xd717c5cd | |||||
0, 235520, 235520, 2048, 4096, 0x5d6e1efd | |||||
0, 237568, 237568, 2048, 4096, 0x4d0eea27 | |||||
0, 239616, 239616, 2048, 4096, 0x70fff90c | |||||
0, 241664, 241664, 2048, 4096, 0xd5cc8207 | |||||
0, 243712, 243712, 2048, 4096, 0xf87cae0e | |||||
0, 245760, 245760, 2048, 4096, 0x26814ab5 | |||||
0, 247808, 247808, 2048, 4096, 0x9569fb8d | |||||
0, 249856, 249856, 2048, 4096, 0x7835122e | |||||
0, 251904, 251904, 2048, 4096, 0xa38840dd | |||||
0, 253952, 253952, 2048, 4096, 0xfc499ba3 | |||||
0, 256000, 256000, 2048, 4096, 0x0aa60cb0 | |||||
0, 258048, 258048, 2048, 4096, 0x530ef56e | |||||
0, 260096, 260096, 2048, 4096, 0xead968db | |||||
0, 262144, 262144, 2048, 4096, 0x64484214 | |||||
0, 264192, 264192, 2048, 4096, 0xfd0cc89e | |||||
0, 266240, 266240, 2048, 4096, 0x0d452a5d | |||||
0, 268288, 268288, 2048, 4096, 0x36ef8482 | |||||
0, 270336, 270336, 2048, 4096, 0x462b641b | |||||
0, 272384, 272384, 2048, 4096, 0x2a5c1c0c | |||||
0, 274432, 274432, 2048, 4096, 0x8837ff80 | |||||
0, 276480, 276480, 2048, 4096, 0x27a3de22 | |||||
0, 278528, 278528, 2048, 4096, 0xf88d28c1 | |||||
0, 280576, 280576, 2048, 4096, 0xed85ea97 | |||||
0, 282624, 282624, 2048, 4096, 0x50c3e7db | |||||
0, 284672, 284672, 2048, 4096, 0x82bcb480 | |||||
0, 286720, 286720, 2048, 4096, 0xc50ee536 | |||||
0, 288768, 288768, 2048, 4096, 0x086280ee | |||||
0, 290816, 290816, 2048, 4096, 0x6f18f2b2 | |||||
0, 292864, 292864, 2048, 4096, 0x1c7c0856 | |||||
0, 294912, 294912, 2048, 4096, 0xc576268a | |||||
0, 296960, 296960, 2048, 4096, 0x7a9af56d | |||||
0, 299008, 299008, 2048, 4096, 0x6d058fc5 | |||||
0, 301056, 301056, 2048, 4096, 0x8fb1107b | |||||
0, 303104, 303104, 2048, 4096, 0x807588d1 | |||||
0, 305152, 305152, 2048, 4096, 0x56178443 | |||||
0, 307200, 307200, 2048, 4096, 0xf2460763 | |||||
0, 309248, 309248, 2048, 4096, 0x284255f2 | |||||
0, 311296, 311296, 2048, 4096, 0xb29d17fb | |||||
0, 313344, 313344, 2048, 4096, 0x5e7e4633 | |||||
0, 315392, 315392, 2048, 4096, 0x57704db1 | |||||
0, 317440, 317440, 2048, 4096, 0xd87dcc1d | |||||
0, 319488, 319488, 2048, 4096, 0x28d4bb93 | |||||
0, 321536, 321536, 2048, 4096, 0x3a2e5c6c | |||||
0, 323584, 323584, 2048, 4096, 0xf3581656 | |||||
0, 325632, 325632, 2048, 4096, 0x42f1942f | |||||
0, 327680, 327680, 2048, 4096, 0xe75c5092 | |||||
0, 329728, 329728, 2048, 4096, 0x3fae7f6d | |||||
0, 331776, 331776, 2048, 4096, 0xf99ad73e | |||||
0, 333824, 333824, 2048, 4096, 0x80564e3e | |||||
0, 335872, 335872, 2048, 4096, 0x8ff6ebe5 | |||||
0, 337920, 337920, 2048, 4096, 0x436d5e69 | |||||
0, 339968, 339968, 684, 1368, 0xe0ebeda3 | |||||
0, 0, 0, 2048, 4096, 0x4f9228b3 | |||||
0, 2048, 2048, 2048, 4096, 0xfab58157 | |||||
0, 4096, 4096, 2048, 4096, 0x0b641c78 | |||||
0, 6144, 6144, 2048, 4096, 0x601c6803 | |||||
0, 8192, 8192, 2048, 4096, 0xb3e2f166 | |||||
0, 10240, 10240, 2048, 4096, 0x5681f206 | |||||
0, 12288, 12288, 2048, 4096, 0x1e69e71f | |||||
0, 14336, 14336, 2048, 4096, 0x05628be3 | |||||
0, 16384, 16384, 2048, 4096, 0x109b1aef | |||||
0, 18432, 18432, 2048, 4096, 0xd5435a9e | |||||
0, 20480, 20480, 2048, 4096, 0xb38b5d28 | |||||
0, 22528, 22528, 2048, 4096, 0x64514c93 | |||||
0, 24576, 24576, 2048, 4096, 0x453350e7 | |||||
0, 26624, 26624, 2048, 4096, 0x6deccce6 | |||||
0, 28672, 28672, 2048, 4096, 0xd427ede1 | |||||
0, 30720, 30720, 2048, 4096, 0xdecb8c42 | |||||
0, 32768, 32768, 2048, 4096, 0x3841e4d2 | |||||
0, 34816, 34816, 2048, 4096, 0x858ac1b1 | |||||
0, 36864, 36864, 2048, 4096, 0x8e9dbfa0 | |||||
0, 38912, 38912, 2048, 4096, 0xcbc0766f | |||||
0, 40960, 40960, 2048, 4096, 0x78d52555 | |||||
0, 43008, 43008, 2048, 4096, 0x600ac7d5 | |||||
0, 45056, 45056, 2048, 4096, 0xafadb7ee | |||||
0, 47104, 47104, 2048, 4096, 0x8009d5a1 | |||||
0, 49152, 49152, 2048, 4096, 0xb07d475e | |||||
0, 51200, 51200, 2048, 4096, 0xfcfecceb | |||||
0, 53248, 53248, 2048, 4096, 0x38b5d85f | |||||
0, 55296, 55296, 2048, 4096, 0xbd48072e | |||||
0, 57344, 57344, 2048, 4096, 0xd04724d8 | |||||
0, 59392, 59392, 2048, 4096, 0x08425144 | |||||
0, 61440, 61440, 2048, 4096, 0x7b14483e | |||||
0, 63488, 63488, 2048, 4096, 0x8858ef4c | |||||
0, 65536, 65536, 2048, 4096, 0x1e3024c2 | |||||
0, 67584, 67584, 2048, 4096, 0xcd6bfe4f | |||||
0, 69632, 69632, 2048, 4096, 0x8cde8d18 | |||||
0, 71680, 71680, 2048, 4096, 0xbbd856b8 | |||||
0, 73728, 73728, 2048, 4096, 0x988c9b7a | |||||
0, 75776, 75776, 2048, 4096, 0x2a858e03 | |||||
0, 77824, 77824, 2048, 4096, 0x6dee1e4a | |||||
0, 79872, 79872, 2048, 4096, 0x8cc38b41 | |||||
0, 81920, 81920, 2048, 4096, 0x48bd5cec | |||||
0, 83968, 83968, 2048, 4096, 0xeb7f606b | |||||
0, 86016, 86016, 2048, 4096, 0x75f5d28c | |||||
0, 88064, 88064, 2048, 4096, 0x5bfeec4b | |||||
0, 90112, 90112, 2048, 4096, 0xfc35c22a | |||||
0, 92160, 92160, 2048, 4096, 0x3a95efba | |||||
0, 94208, 94208, 2048, 4096, 0xefdbce9c | |||||
0, 96256, 96256, 2048, 4096, 0x00594ada | |||||
0, 98304, 98304, 2048, 4096, 0x20ffebfa | |||||
0, 100352, 100352, 2048, 4096, 0x1b31370a | |||||
0, 102400, 102400, 2048, 4096, 0x50766a56 | |||||
0, 104448, 104448, 2048, 4096, 0x0058315a | |||||
0, 106496, 106496, 2048, 4096, 0x98090cbf | |||||
0, 108544, 108544, 2048, 4096, 0x66ed2d40 | |||||
0, 110592, 110592, 2048, 4096, 0xdfd7c0a7 | |||||
0, 112640, 112640, 2048, 4096, 0x2adc57e1 | |||||
0, 114688, 114688, 2048, 4096, 0x838bbc82 | |||||
0, 116736, 116736, 2048, 4096, 0x2c55de1a | |||||
0, 118784, 118784, 2048, 4096, 0xeae027f4 | |||||
0, 120832, 120832, 2048, 4096, 0x09fe00f6 | |||||
0, 122880, 122880, 2048, 4096, 0xa25d9970 | |||||
0, 124928, 124928, 2048, 4096, 0xedb11a20 | |||||
0, 126976, 126976, 2048, 4096, 0x9ce2e63e | |||||
0, 129024, 129024, 2048, 4096, 0xeb699974 | |||||
0, 131072, 131072, 2048, 4096, 0xcc04a296 | |||||
0, 133120, 133120, 2048, 4096, 0xe90e9a12 | |||||
0, 135168, 135168, 2048, 4096, 0xae85c0f7 | |||||
0, 137216, 137216, 2048, 4096, 0x7ee877db | |||||
0, 139264, 139264, 2048, 4096, 0x9ecf14ee | |||||
0, 141312, 141312, 2048, 4096, 0xa821cecd | |||||
0, 143360, 143360, 2048, 4096, 0x2714bb11 | |||||
0, 145408, 145408, 2048, 4096, 0x28f1c1e0 | |||||
0, 147456, 147456, 2048, 4096, 0xf81c4f60 | |||||
0, 149504, 149504, 2048, 4096, 0x1ae0e5a1 | |||||
0, 151552, 151552, 2048, 4096, 0xbdae9d9a | |||||
0, 153600, 153600, 2048, 4096, 0x5202e560 | |||||
0, 155648, 155648, 2048, 4096, 0x82408396 | |||||
0, 157696, 157696, 2048, 4096, 0xc850ce0c | |||||
0, 159744, 159744, 2048, 4096, 0x1d732d88 | |||||
0, 161792, 161792, 2048, 4096, 0xc5c01e33 | |||||
0, 163840, 163840, 2048, 4096, 0x84942d6c | |||||
0, 165888, 165888, 2048, 4096, 0x7c27cd3a | |||||
0, 167936, 167936, 2048, 4096, 0x22adc503 | |||||
0, 169984, 169984, 2048, 4096, 0xfbc3af31 | |||||
0, 172032, 172032, 2048, 4096, 0xe9652b18 | |||||
0, 174080, 174080, 2048, 4096, 0xae75987e | |||||
0, 176128, 176128, 2048, 4096, 0x0f7ea428 | |||||
0, 178176, 178176, 2048, 4096, 0x92b89582 | |||||
0, 180224, 180224, 2048, 4096, 0xf393d910 | |||||
0, 182272, 182272, 2048, 4096, 0x6349b600 | |||||
0, 184320, 184320, 2048, 4096, 0x16918dbd | |||||
0, 186368, 186368, 2048, 4096, 0x14ee15ad | |||||
0, 188416, 188416, 2048, 4096, 0x26b510d3 | |||||
0, 190464, 190464, 2048, 4096, 0x97007bf8 | |||||
0, 192512, 192512, 2048, 4096, 0x3718c509 | |||||
0, 194560, 194560, 2048, 4096, 0x24a54ccd | |||||
0, 196608, 196608, 2048, 4096, 0xc960df4e | |||||
0, 198656, 198656, 2048, 4096, 0xc7cb6e6f | |||||
0, 200704, 200704, 2048, 4096, 0x4c563ae5 | |||||
0, 202752, 202752, 2048, 4096, 0x0dd51432 | |||||
0, 204800, 204800, 2048, 4096, 0xdb4243c8 | |||||
0, 206848, 206848, 2048, 4096, 0x9bb6417f | |||||
0, 208896, 208896, 2048, 4096, 0xec6a40a1 | |||||
0, 210944, 210944, 2048, 4096, 0x82d6c3b4 | |||||
0, 212992, 212992, 2048, 4096, 0xd181e2ec | |||||
0, 215040, 215040, 2048, 4096, 0xba5d7b55 | |||||
0, 217088, 217088, 2048, 4096, 0x78fcb938 | |||||
0, 219136, 219136, 2048, 4096, 0x6691671c | |||||
0, 221184, 221184, 2048, 4096, 0x44fadee7 | |||||
0, 223232, 223232, 2048, 4096, 0xa42720d5 | |||||
0, 225280, 225280, 2048, 4096, 0xc1165a91 | |||||
0, 227328, 227328, 2048, 4096, 0x86aa3e3f | |||||
0, 229376, 229376, 2048, 4096, 0xab5ae57d | |||||
0, 231424, 231424, 2048, 4096, 0x291a91f3 | |||||
0, 233472, 233472, 2048, 4096, 0xfdf0dcfc | |||||
0, 235520, 235520, 2048, 4096, 0x1ef91f67 | |||||
0, 237568, 237568, 2048, 4096, 0xc899efee | |||||
0, 239616, 239616, 2048, 4096, 0x5ade15ac | |||||
0, 241664, 241664, 2048, 4096, 0x04516beb | |||||
0, 243712, 243712, 2048, 4096, 0xbf5ebbb9 | |||||
0, 245760, 245760, 2048, 4096, 0x4a235122 | |||||
0, 247808, 247808, 2048, 4096, 0xd7a3f4a6 | |||||
0, 249856, 249856, 2048, 4096, 0x5f900f20 | |||||
0, 251904, 251904, 2048, 4096, 0xa90b4365 | |||||
0, 253952, 253952, 2048, 4096, 0x63149dc4 | |||||
0, 256000, 256000, 2048, 4096, 0xf12c1ee8 | |||||
0, 258048, 258048, 2048, 4096, 0x6d0fec8c | |||||
0, 260096, 260096, 2048, 4096, 0x65e07850 | |||||
0, 262144, 262144, 2048, 4096, 0x16d951cc | |||||
0, 264192, 264192, 2048, 4096, 0xd296d0c4 | |||||
0, 266240, 266240, 2048, 4096, 0x619b2a53 | |||||
0, 268288, 268288, 2048, 4096, 0x316972d5 | |||||
0, 270336, 270336, 2048, 4096, 0xcfd64e21 | |||||
0, 272384, 272384, 2048, 4096, 0xcbcb10c6 | |||||
0, 274432, 274432, 2048, 4096, 0x20aeff7c | |||||
0, 276480, 276480, 2048, 4096, 0xd205dabd | |||||
0, 278528, 278528, 2048, 4096, 0xac9d3001 | |||||
0, 280576, 280576, 2048, 4096, 0x6d53dfdd | |||||
0, 282624, 282624, 2048, 4096, 0xbb9fe15c | |||||
0, 284672, 284672, 2048, 4096, 0x1852b88b | |||||
0, 286720, 286720, 2048, 4096, 0xb0acec01 | |||||
0, 288768, 288768, 2048, 4096, 0xb52a9342 | |||||
0, 290816, 290816, 2048, 4096, 0x7529faee | |||||
0, 292864, 292864, 2048, 4096, 0x150ff449 | |||||
0, 294912, 294912, 2048, 4096, 0xa81d31d9 | |||||
0, 296960, 296960, 2048, 4096, 0xbcb8084a | |||||
0, 299008, 299008, 2048, 4096, 0x07229514 | |||||
0, 301056, 301056, 2048, 4096, 0xa85cfd88 | |||||
0, 303104, 303104, 2048, 4096, 0x0aef9c27 | |||||
0, 305152, 305152, 2048, 4096, 0x8ec47b39 | |||||
0, 307200, 307200, 2048, 4096, 0x910b0560 | |||||
0, 309248, 309248, 2048, 4096, 0x99a8578e | |||||
0, 311296, 311296, 2048, 4096, 0xb3df1d84 | |||||
0, 313344, 313344, 2048, 4096, 0x48e52559 | |||||
0, 315392, 315392, 2048, 4096, 0xb25c4800 | |||||
0, 317440, 317440, 2048, 4096, 0x913bc8ce | |||||
0, 319488, 319488, 2048, 4096, 0xb736cc8c | |||||
0, 321536, 321536, 2048, 4096, 0x13c66646 | |||||
0, 323584, 323584, 2048, 4096, 0x70a71221 | |||||
0, 325632, 325632, 2048, 4096, 0x3a50a08e | |||||
0, 327680, 327680, 2048, 4096, 0xc0a037b0 | |||||
0, 329728, 329728, 2048, 4096, 0x9a789475 | |||||
0, 331776, 331776, 2048, 4096, 0xc890ca16 | |||||
0, 333824, 333824, 2048, 4096, 0xa0d34bed | |||||
0, 335872, 335872, 2048, 4096, 0x1689fa60 | |||||
0, 337920, 337920, 2048, 4096, 0x5bac4c83 | |||||
0, 339968, 339968, 684, 1368, 0x904be5e5 |
@@ -1 +1 @@ | |||||
750269cc236541df28e15da5c7b0df7a | |||||
94e2f200d6e05b47cec4aa3e94571cf3 |