* qatar/master: h263dec: Propagate AV_LOG_ERRORs from slice decoding through frame decoding with sufficient error recognition x86: cabac: don't load/store context values in asm H.264: optimize CABAC x86 asm for Atom vp3/theora: flush after seek. doc/fftools-common-opts: wording fixes missing from the previous commit. doc: document using AVOptions in fftools. cmdutils: add codec_opts parameter to setup_find_stream_info_opts() cmdutils: clarify documentation for filter_codec_opts() cmdutils: clarify documentation for setup_find_stream_info_opts() lavf: add forgotten attribute_deprecated to av_find_stream_info() Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -810,7 +810,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, int e | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| AVDictionary **setup_find_stream_info_opts(AVFormatContext *s) | |||||
| AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts) | |||||
| { | { | ||||
| int i; | int i; | ||||
| AVDictionary **opts; | AVDictionary **opts; | ||||
| @@ -154,13 +154,27 @@ void parse_options(int argc, char **argv, const OptionDef *options, | |||||
| /** | /** | ||||
| * Filter out options for given codec. | * Filter out options for given codec. | ||||
| * | |||||
| * Create a new options dictionary containing only the options from | |||||
| * opts which apply to the codec with ID codec_id. | |||||
| * | |||||
| * @param encoder if non-zero the codec is an encoder, otherwise is a decoder | |||||
| * @return a pointer to the created dictionary | |||||
| */ | */ | ||||
| AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, int encoder); | AVDictionary *filter_codec_opts(AVDictionary *opts, enum CodecID codec_id, int encoder); | ||||
| /* | |||||
| * Setup AVCodecContext options for avformat_find_stream_info. | |||||
| /** | |||||
| * Setup AVCodecContext options for avformat_find_stream_info(). | |||||
| * | |||||
| * Create an array of dictionaries, one dictionary for each stream | |||||
| * contained in s. | |||||
| * Each dictionary will contain the options from codec_opts which can | |||||
| * be applied to the corresponding stream codec context. | |||||
| * | |||||
| * @return pointer to the created array of dictionaries, NULL if it | |||||
| * cannot be created | |||||
| */ | */ | ||||
| AVDictionary **setup_find_stream_info_opts(AVFormatContext *s); | |||||
| AVDictionary **setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts); | |||||
| /** | /** | ||||
| * Print an error message to stderr, indicating filename and a human | * Print an error message to stderr, indicating filename and a human | ||||
| @@ -475,6 +475,8 @@ FF_ER_COMPLIANT | |||||
| FF_ER_AGGRESSIVE | FF_ER_AGGRESSIVE | ||||
| @item 4 | @item 4 | ||||
| FF_ER_VERY_AGGRESSIVE | FF_ER_VERY_AGGRESSIVE | ||||
| @item 5 | |||||
| FF_ER_EXPLODE | |||||
| @end table | @end table | ||||
| @item -ec @var{bit_mask} | @item -ec @var{bit_mask} | ||||
| @@ -91,3 +91,28 @@ The use of the environment variable @env{NO_COLOR} is deprecated and | |||||
| will be dropped in a following FFmpeg version. | will be dropped in a following FFmpeg version. | ||||
| @end table | @end table | ||||
| @section AVOptions | |||||
| These options are provided directly by the libavformat, libavdevice and | |||||
| libavcodec libraries. To see the list of available AVOptions, use the | |||||
| @option{-help} option. They are separated into two categories: | |||||
| @table @option | |||||
| @item generic | |||||
| These options can be set for any container, codec or device. Generic options are | |||||
| listed under AVFormatContext options for containers/devices and under | |||||
| AVCodecContext options for codecs. | |||||
| @item private | |||||
| These options are specific to the given container, device or codec. Private | |||||
| options are listed under their corresponding containers/devices/codecs. | |||||
| @end table | |||||
| For example to write an ID3v2.3 header instead of a default ID3v2.4 to | |||||
| an MP3 file, use the @option{id3v2_version} private option of the MP3 | |||||
| muxer: | |||||
| @example | |||||
| ffmpeg -i input.flac -id3v2_version 3 out.mp3 | |||||
| @end example | |||||
| Note -nooption syntax cannot be used for boolean AVOptions, use -option | |||||
| 0/-option 1. | |||||
| @@ -3388,7 +3388,7 @@ static int opt_input_file(const char *opt, const char *filename) | |||||
| } | } | ||||
| /* Set AVCodecContext options for avformat_find_stream_info */ | /* Set AVCodecContext options for avformat_find_stream_info */ | ||||
| opts = setup_find_stream_info_opts(ic); | |||||
| opts = setup_find_stream_info_opts(ic, codec_opts); | |||||
| orig_nb_streams = ic->nb_streams; | orig_nb_streams = ic->nb_streams; | ||||
| /* If not enough info to get the stream parameters, we decode the | /* If not enough info to get the stream parameters, we decode the | ||||
| @@ -2332,7 +2332,7 @@ static int read_thread(void *arg) | |||||
| if(genpts) | if(genpts) | ||||
| ic->flags |= AVFMT_FLAG_GENPTS; | ic->flags |= AVFMT_FLAG_GENPTS; | ||||
| opts = setup_find_stream_info_opts(ic); | |||||
| opts = setup_find_stream_info_opts(ic, codec_opts); | |||||
| orig_nb_streams = ic->nb_streams; | orig_nb_streams = ic->nb_streams; | ||||
| err = avformat_find_stream_info(ic, opts); | err = avformat_find_stream_info(ic, opts); | ||||
| @@ -1493,6 +1493,7 @@ typedef struct AVCodecContext { | |||||
| #define FF_ER_COMPLIANT 2 | #define FF_ER_COMPLIANT 2 | ||||
| #define FF_ER_AGGRESSIVE 3 | #define FF_ER_AGGRESSIVE 3 | ||||
| #define FF_ER_VERY_AGGRESSIVE 4 | #define FF_ER_VERY_AGGRESSIVE 4 | ||||
| #define FF_ER_EXPLODE 5 | |||||
| /** | /** | ||||
| * Called at the beginning of each frame to get a buffer for it. | * Called at the beginning of each frame to get a buffer for it. | ||||
| @@ -650,7 +650,7 @@ retry: | |||||
| s->mb_x=0; | s->mb_x=0; | ||||
| s->mb_y=0; | s->mb_y=0; | ||||
| decode_slice(s); | |||||
| ret = decode_slice(s); | |||||
| while(s->mb_y<s->mb_height){ | while(s->mb_y<s->mb_height){ | ||||
| if(s->msmpeg4_version){ | if(s->msmpeg4_version){ | ||||
| if(s->slice_height==0 || s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits) | if(s->slice_height==0 || s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits) | ||||
| @@ -666,7 +666,7 @@ retry: | |||||
| if(s->msmpeg4_version<4 && s->h263_pred) | if(s->msmpeg4_version<4 && s->h263_pred) | ||||
| ff_mpeg4_clean_buffers(s); | ff_mpeg4_clean_buffers(s); | ||||
| decode_slice(s); | |||||
| if (decode_slice(s) < 0) ret = AVERROR_INVALIDDATA; | |||||
| } | } | ||||
| if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type==AV_PICTURE_TYPE_I) | if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type==AV_PICTURE_TYPE_I) | ||||
| @@ -730,7 +730,7 @@ assert(s->current_picture.pict_type == s->pict_type); | |||||
| av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time); | av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time); | ||||
| #endif | #endif | ||||
| return get_consumed_bytes(s, buf_size); | |||||
| return (ret && avctx->error_recognition >= FF_ER_EXPLODE)?ret:get_consumed_bytes(s, buf_size); | |||||
| } | } | ||||
| AVCodec ff_h263_decoder = { | AVCodec ff_h263_decoder = { | ||||
| @@ -1649,7 +1649,7 @@ static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCT | |||||
| const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD]; | const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD]; | ||||
| #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS) | #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS) | ||||
| coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, | coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, | ||||
| last_coeff_ctx_base-significant_coeff_ctx_base, sig_off); | |||||
| last_coeff_ctx_base, sig_off); | |||||
| } else { | } else { | ||||
| coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index, | coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index, | ||||
| last_coeff_ctx_base-significant_coeff_ctx_base); | last_coeff_ctx_base-significant_coeff_ctx_base); | ||||
| @@ -184,6 +184,7 @@ static const AVOption options[]={ | |||||
| {"compliant", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_COMPLIANT }, INT_MIN, INT_MAX, V|D, "er"}, | {"compliant", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_COMPLIANT }, INT_MIN, INT_MAX, V|D, "er"}, | ||||
| {"aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"}, | {"aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"}, | ||||
| {"very_aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_VERY_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"}, | {"very_aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_VERY_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"}, | ||||
| {"explode", "abort decoding on error recognition", 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_EXPLODE }, INT_MIN, INT_MAX, V|D, "er"}, | |||||
| {"has_b_frames", NULL, OFFSET(has_b_frames), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | {"has_b_frames", NULL, OFFSET(has_b_frames), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| {"block_align", NULL, OFFSET(block_align), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | {"block_align", NULL, OFFSET(block_align), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| {"parse_only", NULL, OFFSET(parse_only), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | {"parse_only", NULL, OFFSET(parse_only), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| @@ -2321,6 +2321,26 @@ static av_cold int theora_decode_init(AVCodecContext *avctx) | |||||
| return vp3_decode_init(avctx); | return vp3_decode_init(avctx); | ||||
| } | } | ||||
| static void vp3_decode_flush(AVCodecContext *avctx) | |||||
| { | |||||
| Vp3DecodeContext *s = avctx->priv_data; | |||||
| if (s->golden_frame.data[0]) { | |||||
| if (s->golden_frame.data[0] == s->last_frame.data[0]) | |||||
| memset(&s->last_frame, 0, sizeof(AVFrame)); | |||||
| if (s->current_frame.data[0] == s->golden_frame.data[0]) | |||||
| memset(&s->current_frame, 0, sizeof(AVFrame)); | |||||
| ff_thread_release_buffer(avctx, &s->golden_frame); | |||||
| } | |||||
| if (s->last_frame.data[0]) { | |||||
| if (s->current_frame.data[0] == s->last_frame.data[0]) | |||||
| memset(&s->current_frame, 0, sizeof(AVFrame)); | |||||
| ff_thread_release_buffer(avctx, &s->last_frame); | |||||
| } | |||||
| if (s->current_frame.data[0]) | |||||
| ff_thread_release_buffer(avctx, &s->current_frame); | |||||
| } | |||||
| AVCodec ff_theora_decoder = { | AVCodec ff_theora_decoder = { | ||||
| "theora", | "theora", | ||||
| AVMEDIA_TYPE_VIDEO, | AVMEDIA_TYPE_VIDEO, | ||||
| @@ -2332,6 +2352,7 @@ AVCodec ff_theora_decoder = { | |||||
| vp3_decode_frame, | vp3_decode_frame, | ||||
| CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_FRAME_THREADS, | CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_FRAME_THREADS, | ||||
| NULL, | NULL, | ||||
| .flush = vp3_decode_flush, | |||||
| .long_name = NULL_IF_CONFIG_SMALL("Theora"), | .long_name = NULL_IF_CONFIG_SMALL("Theora"), | ||||
| .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context) | .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context) | ||||
| }; | }; | ||||
| @@ -2348,6 +2369,7 @@ AVCodec ff_vp3_decoder = { | |||||
| vp3_decode_frame, | vp3_decode_frame, | ||||
| CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_FRAME_THREADS, | CODEC_CAP_DR1 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_FRAME_THREADS, | ||||
| NULL, | NULL, | ||||
| .flush = vp3_decode_flush, | |||||
| .long_name = NULL_IF_CONFIG_SMALL("On2 VP3"), | .long_name = NULL_IF_CONFIG_SMALL("On2 VP3"), | ||||
| .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context) | .update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context) | ||||
| }; | }; | ||||
| @@ -34,8 +34,8 @@ | |||||
| "cmova %%ecx , "range" \n\t"\ | "cmova %%ecx , "range" \n\t"\ | ||||
| "sbb %%ecx , %%ecx \n\t"\ | "sbb %%ecx , %%ecx \n\t"\ | ||||
| "and %%ecx , "tmp" \n\t"\ | "and %%ecx , "tmp" \n\t"\ | ||||
| "sub "tmp" , "low" \n\t"\ | |||||
| "xor %%ecx , "ret" \n\t" | |||||
| "xor %%ecx , "ret" \n\t"\ | |||||
| "sub "tmp" , "low" \n\t" | |||||
| #else /* HAVE_FAST_CMOV */ | #else /* HAVE_FAST_CMOV */ | ||||
| #define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp)\ | #define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp)\ | ||||
| "mov "tmp" , %%ecx \n\t"\ | "mov "tmp" , %%ecx \n\t"\ | ||||
| @@ -62,21 +62,20 @@ | |||||
| "movzbl " MANGLE(ff_h264_norm_shift) "("range"), %%ecx \n\t"\ | "movzbl " MANGLE(ff_h264_norm_shift) "("range"), %%ecx \n\t"\ | ||||
| "shl %%cl , "range" \n\t"\ | "shl %%cl , "range" \n\t"\ | ||||
| "movzbl "MANGLE(ff_h264_mlps_state)"+128("ret"), "tmp" \n\t"\ | "movzbl "MANGLE(ff_h264_mlps_state)"+128("ret"), "tmp" \n\t"\ | ||||
| "mov "tmpbyte" , "statep" \n\t"\ | |||||
| "shl %%cl , "low" \n\t"\ | "shl %%cl , "low" \n\t"\ | ||||
| "mov "tmpbyte" , "statep" \n\t"\ | |||||
| "test "lowword" , "lowword" \n\t"\ | "test "lowword" , "lowword" \n\t"\ | ||||
| " jnz 1f \n\t"\ | " jnz 1f \n\t"\ | ||||
| "mov "byte"("cabac"), %%"REG_c" \n\t"\ | "mov "byte"("cabac"), %%"REG_c" \n\t"\ | ||||
| "add $2 , "byte "("cabac") \n\t"\ | |||||
| "movzwl (%%"REG_c") , "tmp" \n\t"\ | "movzwl (%%"REG_c") , "tmp" \n\t"\ | ||||
| "bswap "tmp" \n\t"\ | |||||
| "shr $15 , "tmp" \n\t"\ | |||||
| "sub $0xFFFF , "tmp" \n\t"\ | |||||
| "add $2 , %%"REG_c" \n\t"\ | |||||
| "mov %%"REG_c" , "byte "("cabac") \n\t"\ | |||||
| "lea -1("low") , %%ecx \n\t"\ | "lea -1("low") , %%ecx \n\t"\ | ||||
| "xor "low" , %%ecx \n\t"\ | "xor "low" , %%ecx \n\t"\ | ||||
| "shr $15 , %%ecx \n\t"\ | "shr $15 , %%ecx \n\t"\ | ||||
| "bswap "tmp" \n\t"\ | |||||
| "shr $15 , "tmp" \n\t"\ | |||||
| "movzbl " MANGLE(ff_h264_norm_shift) "(%%ecx), %%ecx \n\t"\ | "movzbl " MANGLE(ff_h264_norm_shift) "(%%ecx), %%ecx \n\t"\ | ||||
| "sub $0xFFFF , "tmp" \n\t"\ | |||||
| "neg %%ecx \n\t"\ | "neg %%ecx \n\t"\ | ||||
| "add $7 , %%ecx \n\t"\ | "add $7 , %%ecx \n\t"\ | ||||
| "shl %%cl , "tmp" \n\t"\ | "shl %%cl , "tmp" \n\t"\ | ||||
| @@ -88,19 +87,13 @@ | |||||
| static av_always_inline int get_cabac_inline_x86(CABACContext *c, | static av_always_inline int get_cabac_inline_x86(CABACContext *c, | ||||
| uint8_t *const state) | uint8_t *const state) | ||||
| { | { | ||||
| int bit, low, range, tmp; | |||||
| int bit, tmp; | |||||
| __asm__ volatile( | __asm__ volatile( | ||||
| "movl %a6(%5), %2 \n\t" | |||||
| "movl %a7(%5), %1 \n\t" | |||||
| BRANCHLESS_GET_CABAC("%0", "%5", "(%4)", "%1", "%w1", "%2", | BRANCHLESS_GET_CABAC("%0", "%5", "(%4)", "%1", "%w1", "%2", | ||||
| "%3", "%b3", "%a8") | |||||
| "movl %2, %a6(%5) \n\t" | |||||
| "movl %1, %a7(%5) \n\t" | |||||
| :"=&r"(bit), "=&r"(low), "=&r"(range), "=&q"(tmp) | |||||
| "%3", "%b3", "%a6") | |||||
| :"=&r"(bit), "+&r"(c->low), "+&r"(c->range), "=&q"(tmp) | |||||
| :"r"(state), "r"(c), | :"r"(state), "r"(c), | ||||
| "i"(offsetof(CABACContext, range)), "i"(offsetof(CABACContext, low)), | |||||
| "i"(offsetof(CABACContext, bytestream)) | "i"(offsetof(CABACContext, bytestream)) | ||||
| : "%"REG_c, "memory" | : "%"REG_c, "memory" | ||||
| ); | ); | ||||
| @@ -45,23 +45,18 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, | |||||
| int minusindex= 4-(intptr_t)index; | int minusindex= 4-(intptr_t)index; | ||||
| int bit; | int bit; | ||||
| x86_reg coeff_count; | x86_reg coeff_count; | ||||
| int low; | |||||
| int range; | |||||
| __asm__ volatile( | __asm__ volatile( | ||||
| "movl %a11(%6), %5 \n\t" | |||||
| "movl %a12(%6), %3 \n\t" | |||||
| "2: \n\t" | "2: \n\t" | ||||
| BRANCHLESS_GET_CABAC("%4", "%6", "(%1)", "%3", | BRANCHLESS_GET_CABAC("%4", "%6", "(%1)", "%3", | ||||
| "%w3", "%5", "%k0", "%b0", "%a13") | |||||
| "%w3", "%5", "%k0", "%b0", "%a11") | |||||
| "test $1, %4 \n\t" | "test $1, %4 \n\t" | ||||
| " jz 3f \n\t" | " jz 3f \n\t" | ||||
| "add %10, %1 \n\t" | "add %10, %1 \n\t" | ||||
| BRANCHLESS_GET_CABAC("%4", "%6", "(%1)", "%3", | BRANCHLESS_GET_CABAC("%4", "%6", "(%1)", "%3", | ||||
| "%w3", "%5", "%k0", "%b0", "%a13") | |||||
| "%w3", "%5", "%k0", "%b0", "%a11") | |||||
| "sub %10, %1 \n\t" | "sub %10, %1 \n\t" | ||||
| "mov %2, %0 \n\t" | "mov %2, %0 \n\t" | ||||
| @@ -72,8 +67,7 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, | |||||
| "test $1, %4 \n\t" | "test $1, %4 \n\t" | ||||
| " jnz 4f \n\t" | " jnz 4f \n\t" | ||||
| "add $4, %0 \n\t" | |||||
| "mov %0, %2 \n\t" | |||||
| "add $4, %2 \n\t" | |||||
| "3: \n\t" | "3: \n\t" | ||||
| "add $1, %1 \n\t" | "add $1, %1 \n\t" | ||||
| @@ -86,13 +80,9 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, | |||||
| "4: \n\t" | "4: \n\t" | ||||
| "add %9, %k0 \n\t" | "add %9, %k0 \n\t" | ||||
| "shr $2, %k0 \n\t" | "shr $2, %k0 \n\t" | ||||
| "movl %5, %a11(%6) \n\t" | |||||
| "movl %3, %a12(%6) \n\t" | |||||
| :"=&q"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index), | :"=&q"(coeff_count), "+r"(significant_coeff_ctx_base), "+m"(index), | ||||
| "=&r"(low), "=&r"(bit), "=&r"(range) | |||||
| "+&r"(c->low), "=&r"(bit), "+&r"(c->range) | |||||
| :"r"(c), "m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off), | :"r"(c), "m"(minusstart), "m"(end), "m"(minusindex), "m"(last_off), | ||||
| "i"(offsetof(CABACContext, range)), "i"(offsetof(CABACContext, low)), | |||||
| "i"(offsetof(CABACContext, bytestream)) | "i"(offsetof(CABACContext, bytestream)) | ||||
| : "%"REG_c, "memory" | : "%"REG_c, "memory" | ||||
| ); | ); | ||||
| @@ -101,18 +91,13 @@ static int decode_significance_x86(CABACContext *c, int max_coeff, | |||||
| static int decode_significance_8x8_x86(CABACContext *c, | static int decode_significance_8x8_x86(CABACContext *c, | ||||
| uint8_t *significant_coeff_ctx_base, | uint8_t *significant_coeff_ctx_base, | ||||
| int *index, x86_reg last_off, const uint8_t *sig_off){ | |||||
| int *index, uint8_t *last_coeff_ctx_base, const uint8_t *sig_off){ | |||||
| int minusindex= 4-(intptr_t)index; | int minusindex= 4-(intptr_t)index; | ||||
| int bit; | int bit; | ||||
| x86_reg coeff_count; | x86_reg coeff_count; | ||||
| int low; | |||||
| int range; | |||||
| x86_reg last=0; | x86_reg last=0; | ||||
| x86_reg state; | x86_reg state; | ||||
| __asm__ volatile( | __asm__ volatile( | ||||
| "movl %a12(%7), %5 \n\t" | |||||
| "movl %a13(%7), %3 \n\t" | |||||
| "mov %1, %6 \n\t" | "mov %1, %6 \n\t" | ||||
| "2: \n\t" | "2: \n\t" | ||||
| @@ -121,18 +106,17 @@ static int decode_significance_8x8_x86(CABACContext *c, | |||||
| "add %9, %6 \n\t" | "add %9, %6 \n\t" | ||||
| BRANCHLESS_GET_CABAC("%4", "%7", "(%6)", "%3", | BRANCHLESS_GET_CABAC("%4", "%7", "(%6)", "%3", | ||||
| "%w3", "%5", "%k0", "%b0", "%a14") | |||||
| "%w3", "%5", "%k0", "%b0", "%a12") | |||||
| "mov %1, %k6 \n\t" | "mov %1, %k6 \n\t" | ||||
| "test $1, %4 \n\t" | "test $1, %4 \n\t" | ||||
| " jz 3f \n\t" | " jz 3f \n\t" | ||||
| "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%k6), %k6\n\t" | "movzbl "MANGLE(last_coeff_flag_offset_8x8)"(%k6), %k6\n\t" | ||||
| "add %9, %6 \n\t" | |||||
| "add %11, %6 \n\t" | "add %11, %6 \n\t" | ||||
| BRANCHLESS_GET_CABAC("%4", "%7", "(%6)", "%3", | BRANCHLESS_GET_CABAC("%4", "%7", "(%6)", "%3", | ||||
| "%w3", "%5", "%k0", "%b0", "%a14") | |||||
| "%w3", "%5", "%k0", "%b0", "%a12") | |||||
| "mov %2, %0 \n\t" | "mov %2, %0 \n\t" | ||||
| "mov %1, %k6 \n\t" | "mov %1, %k6 \n\t" | ||||
| @@ -141,8 +125,7 @@ static int decode_significance_8x8_x86(CABACContext *c, | |||||
| "test $1, %4 \n\t" | "test $1, %4 \n\t" | ||||
| " jnz 4f \n\t" | " jnz 4f \n\t" | ||||
| "add $4, %0 \n\t" | |||||
| "mov %0, %2 \n\t" | |||||
| "add $4, %2 \n\t" | |||||
| "3: \n\t" | "3: \n\t" | ||||
| "addl $1, %k6 \n\t" | "addl $1, %k6 \n\t" | ||||
| @@ -154,13 +137,9 @@ static int decode_significance_8x8_x86(CABACContext *c, | |||||
| "4: \n\t" | "4: \n\t" | ||||
| "addl %8, %k0 \n\t" | "addl %8, %k0 \n\t" | ||||
| "shr $2, %k0 \n\t" | "shr $2, %k0 \n\t" | ||||
| "movl %5, %a12(%7) \n\t" | |||||
| "movl %3, %a13(%7) \n\t" | |||||
| :"=&q"(coeff_count),"+m"(last), "+m"(index), "=&r"(low), "=&r"(bit), | |||||
| "=&r"(range), "=&r"(state) | |||||
| :"r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off), "m"(last_off), | |||||
| "i"(offsetof(CABACContext, range)), "i"(offsetof(CABACContext, low)), | |||||
| :"=&q"(coeff_count),"+m"(last), "+m"(index), "+&r"(c->low), "=&r"(bit), | |||||
| "+&r"(c->range), "=&r"(state) | |||||
| :"r"(c), "m"(minusindex), "m"(significant_coeff_ctx_base), "m"(sig_off), "m"(last_coeff_ctx_base), | |||||
| "i"(offsetof(CABACContext, bytestream)) | "i"(offsetof(CABACContext, bytestream)) | ||||
| : "%"REG_c, "memory" | : "%"REG_c, "memory" | ||||
| ); | ); | ||||
| @@ -1188,6 +1188,7 @@ int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oforma | |||||
| * | * | ||||
| * @deprecated use avformat_find_stream_info. | * @deprecated use avformat_find_stream_info. | ||||
| */ | */ | ||||
| attribute_deprecated | |||||
| int av_find_stream_info(AVFormatContext *ic); | int av_find_stream_info(AVFormatContext *ic); | ||||
| #endif | #endif | ||||