* qatar/master: cosmetics: Consistently use C-style comments with multiple inclusion guards anm: fix a few Doxygen comments misc typo and wording fixes attributes: add av_noreturn attributes: drop pointless define guards configure: do not disable av_always_inline with --enable-small flvdec: initial stream switch support avplay: fix write on freed memory for rawvideo snow: remove a VLA used for edge emulation x86: lavfi: fix gradfun/yadif build with mmx/sse disabled snow: remove the runs[] VLA. snow: Check mallocs at init flacdec: remove redundant setting of avctx->sample_fmt Conflicts: ffplay.c libavcodec/h264.c libavcodec/snow.c libavcodec/snow.h libavcodec/snowdec.c libavcodec/snowenc.c libavformat/flvdec.c libavutil/attributes.h tools/patcheck Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.0
@@ -376,7 +376,7 @@ FILE *get_preset_file(char *filename, size_t filename_size, | |||||
* Do all the necessary cleanup and abort. | * Do all the necessary cleanup and abort. | ||||
* This function is implemented in the avtools, not cmdutils. | * This function is implemented in the avtools, not cmdutils. | ||||
*/ | */ | ||||
void exit_program(int ret); | |||||
av_noreturn void exit_program(int ret); | |||||
/** | /** | ||||
* Realloc array to hold new_size elements of elem_size. | * Realloc array to hold new_size elements of elem_size. | ||||
@@ -3856,15 +3856,6 @@ test -n "$assert_level" && | |||||
test -n "$malloc_prefix" && | test -n "$malloc_prefix" && | ||||
echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH | echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH | ||||
if enabled small || disabled optimizations; then | |||||
echo "#undef av_always_inline" >> $TMPH | |||||
if enabled small; then | |||||
echo "#define av_always_inline inline" >> $TMPH | |||||
else | |||||
echo "#define av_always_inline av_unused" >> $TMPH | |||||
fi | |||||
fi | |||||
if enabled yasm; then | if enabled yasm; then | ||||
append config_files $TMPASM | append config_files $TMPASM | ||||
printf '' >$TMPASM | printf '' >$TMPASM | ||||
@@ -1632,6 +1632,7 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c | |||||
static int video_thread(void *arg) | static int video_thread(void *arg) | ||||
{ | { | ||||
AVPacket pkt = { 0 }; | |||||
VideoState *is = arg; | VideoState *is = arg; | ||||
AVFrame *frame = avcodec_alloc_frame(); | AVFrame *frame = avcodec_alloc_frame(); | ||||
int64_t pts_int = AV_NOPTS_VALUE, pos = -1; | int64_t pts_int = AV_NOPTS_VALUE, pos = -1; | ||||
@@ -1655,7 +1656,6 @@ static int video_thread(void *arg) | |||||
#endif | #endif | ||||
for (;;) { | for (;;) { | ||||
AVPacket pkt; | |||||
#if CONFIG_AVFILTER | #if CONFIG_AVFILTER | ||||
AVFilterBufferRef *picref; | AVFilterBufferRef *picref; | ||||
AVRational tb; | AVRational tb; | ||||
@@ -1664,14 +1664,14 @@ static int video_thread(void *arg) | |||||
SDL_Delay(10); | SDL_Delay(10); | ||||
avcodec_get_frame_defaults(frame); | avcodec_get_frame_defaults(frame); | ||||
av_free_packet(&pkt); | |||||
ret = get_video_frame(is, frame, &pts_int, &pkt); | ret = get_video_frame(is, frame, &pts_int, &pkt); | ||||
if (ret < 0) | if (ret < 0) | ||||
goto the_end; | goto the_end; | ||||
if (!ret) { | |||||
av_free_packet(&pkt); | |||||
if (!ret) | |||||
continue; | continue; | ||||
} | |||||
#if CONFIG_AVFILTER | #if CONFIG_AVFILTER | ||||
if ( last_w != is->video_st->codec->width | if ( last_w != is->video_st->codec->width | ||||
@@ -1766,6 +1766,7 @@ static int video_thread(void *arg) | |||||
av_freep(&vfilters); | av_freep(&vfilters); | ||||
avfilter_graph_free(&graph); | avfilter_graph_free(&graph); | ||||
#endif | #endif | ||||
av_free_packet(&pkt); | |||||
av_free(frame); | av_free(frame); | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -56,8 +56,9 @@ static av_cold int decode_init(AVCodecContext *avctx) | |||||
/** | /** | ||||
* Perform decode operation | * Perform decode operation | ||||
* @param dst, dst_end Destination image buffer | |||||
* @param gb, GetByteContext (optional, see below) | |||||
* @param dst pointer to destination image buffer | |||||
* @param dst_end pointer to end of destination image buffer | |||||
* @param gb GetByteContext (optional, see below) | |||||
* @param pixel Fill color (optional, see below) | * @param pixel Fill color (optional, see below) | ||||
* @param count Pixel count | * @param count Pixel count | ||||
* @param x Pointer to x-axis counter | * @param x Pointer to x-axis counter | ||||
@@ -66,8 +67,8 @@ static av_cold int decode_init(AVCodecContext *avctx) | |||||
* @return non-zero if destination buffer is exhausted | * @return non-zero if destination buffer is exhausted | ||||
* | * | ||||
* a copy operation is achieved when 'gb' is set | * a copy operation is achieved when 'gb' is set | ||||
* a fill operation is acheived when 'gb' is null and pixel is >= 0 | |||||
* a skip operation is acheived when 'gb' is null and pixel is < 0 | |||||
* a fill operation is achieved when 'gb' is null and pixel is >= 0 | |||||
* a skip operation is achieved when 'gb' is null and pixel is < 0 | |||||
*/ | */ | ||||
static inline int op(uint8_t **dst, const uint8_t *dst_end, | static inline int op(uint8_t **dst, const uint8_t *dst_end, | ||||
GetByteContext *gb, | GetByteContext *gb, | ||||
@@ -552,9 +552,9 @@ typedef struct DSPContext { | |||||
* @param src source array | * @param src source array | ||||
* constraints: 16-byte aligned | * constraints: 16-byte aligned | ||||
* @param min minimum value | * @param min minimum value | ||||
* constraints: must in the the range [-(1<<24), 1<<24] | |||||
* constraints: must be in the range [-(1 << 24), 1 << 24] | |||||
* @param max maximum value | * @param max maximum value | ||||
* constraints: must in the the range [-(1<<24), 1<<24] | |||||
* constraints: must be in the range [-(1 << 24), 1 << 24] | |||||
* @param len number of elements in the array | * @param len number of elements in the array | ||||
* constraints: multiple of 32 greater than zero | * constraints: multiple of 32 greater than zero | ||||
*/ | */ | ||||
@@ -108,8 +108,6 @@ static av_cold int flac_decode_init(AVCodecContext *avctx) | |||||
FLACContext *s = avctx->priv_data; | FLACContext *s = avctx->priv_data; | ||||
s->avctx = avctx; | s->avctx = avctx; | ||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16; | |||||
/* for now, the raw FLAC header is allowed to be passed to the decoder as | /* for now, the raw FLAC header is allowed to be passed to the decoder as | ||||
frame data instead of extradata. */ | frame data instead of extradata. */ | ||||
if (!avctx->extradata) | if (!avctx->extradata) | ||||
@@ -1737,7 +1737,7 @@ static av_always_inline void backup_mb_border(H264Context *h, uint8_t *src_y, | |||||
} | } | ||||
top_border = h->top_borders[top_idx][s->mb_x]; | top_border = h->top_borders[top_idx][s->mb_x]; | ||||
/* There are two lines saved, the line above the the top macroblock | |||||
/* There are two lines saved, the line above the top macroblock | |||||
* of a pair, and the line above the bottom macroblock. */ | * of a pair, and the line above the bottom macroblock. */ | ||||
AV_COPY128(top_border, src_y + 16 * linesize); | AV_COPY128(top_border, src_y + 16 * linesize); | ||||
if (pixel_shift) | if (pixel_shift) | ||||
@@ -4443,7 +4443,7 @@ again: | |||||
init_get_bits(&s->gb, ptr, bit_length); | init_get_bits(&s->gb, ptr, bit_length); | ||||
if (ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? (nalsize != consumed) && nalsize : 1)) { | if (ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? (nalsize != consumed) && nalsize : 1)) { | ||||
av_log(h->s.avctx, AV_LOG_DEBUG, | av_log(h->s.avctx, AV_LOG_DEBUG, | ||||
"SPS decoding failure, trying alternative mode\n"); | |||||
"SPS decoding failure, trying again with the complete NAL\n"); | |||||
if (h->is_avc) | if (h->is_avc) | ||||
av_assert0(next_avc - buf_index + consumed == nalsize); | av_assert0(next_avc - buf_index + consumed == nalsize); | ||||
init_get_bits(&s->gb, &buf[buf_index + 1 - consumed], | init_get_bits(&s->gb, &buf[buf_index + 1 - consumed], | ||||
@@ -394,7 +394,8 @@ mca( 8, 8,8) | |||||
av_cold int ff_snow_common_init(AVCodecContext *avctx){ | av_cold int ff_snow_common_init(AVCodecContext *avctx){ | ||||
SnowContext *s = avctx->priv_data; | SnowContext *s = avctx->priv_data; | ||||
int width, height; | int width, height; | ||||
int i, j; | |||||
int i, j, ret; | |||||
int emu_buf_size; | |||||
s->avctx= avctx; | s->avctx= avctx; | ||||
s->max_ref_frames=1; //just make sure its not an invalid value in case of no initial keyframe | s->max_ref_frames=1; //just make sure its not an invalid value in case of no initial keyframe | ||||
@@ -447,19 +448,27 @@ av_cold int ff_snow_common_init(AVCodecContext *avctx){ | |||||
width= s->avctx->width; | width= s->avctx->width; | ||||
height= s->avctx->height; | height= s->avctx->height; | ||||
s->spatial_idwt_buffer= av_mallocz(width*height*sizeof(IDWTELEM)); | |||||
s->spatial_dwt_buffer= av_mallocz(width*height*sizeof(DWTELEM)); //FIXME this does not belong here | |||||
s->temp_dwt_buffer = av_mallocz(width * sizeof(DWTELEM)); | |||||
s->temp_idwt_buffer = av_mallocz(width * sizeof(IDWTELEM)); | |||||
FF_ALLOCZ_OR_GOTO(avctx, s->spatial_idwt_buffer, width * height * sizeof(IDWTELEM), fail); | |||||
FF_ALLOCZ_OR_GOTO(avctx, s->spatial_dwt_buffer, width * height * sizeof(DWTELEM), fail); //FIXME this does not belong here | |||||
FF_ALLOCZ_OR_GOTO(avctx, s->temp_dwt_buffer, width * sizeof(DWTELEM), fail); | |||||
FF_ALLOCZ_OR_GOTO(avctx, s->temp_idwt_buffer, width * sizeof(IDWTELEM), fail); | |||||
FF_ALLOC_OR_GOTO(avctx, s->run_buffer, ((width + 1) >> 1) * ((height + 1) >> 1) * sizeof(*s->run_buffer), fail); | |||||
for(i=0; i<MAX_REF_FRAMES; i++) | for(i=0; i<MAX_REF_FRAMES; i++) | ||||
for(j=0; j<MAX_REF_FRAMES; j++) | for(j=0; j<MAX_REF_FRAMES; j++) | ||||
ff_scale_mv_ref[i][j] = 256*(i+1)/(j+1); | ff_scale_mv_ref[i][j] = 256*(i+1)/(j+1); | ||||
s->avctx->get_buffer(s->avctx, &s->mconly_picture); | |||||
s->scratchbuf = av_mallocz(s->mconly_picture.linesize[0]*7*MB_SIZE); | |||||
if ((ret = s->avctx->get_buffer(s->avctx, &s->mconly_picture)) < 0) { | |||||
// av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |||||
// return ret; | |||||
} | |||||
FF_ALLOCZ_OR_GOTO(avctx, s->scratchbuf, FFMAX(s->mconly_picture.linesize[0], 2*width+256)*7*MB_SIZE, fail); | |||||
emu_buf_size = FFMAX(s->mconly_picture.linesize[0], 2*width+256) * (2 * MB_SIZE + HTAPS_MAX - 1); | |||||
FF_ALLOC_OR_GOTO(avctx, s->emu_edge_buffer, emu_buf_size, fail); | |||||
return 0; | return 0; | ||||
fail: | |||||
return AVERROR(ENOMEM); | |||||
} | } | ||||
int ff_snow_common_init_after_header(AVCodecContext *avctx) { | int ff_snow_common_init_after_header(AVCodecContext *avctx) { | ||||
@@ -632,6 +641,7 @@ av_cold void ff_snow_common_end(SnowContext *s) | |||||
av_freep(&s->temp_dwt_buffer); | av_freep(&s->temp_dwt_buffer); | ||||
av_freep(&s->spatial_idwt_buffer); | av_freep(&s->spatial_idwt_buffer); | ||||
av_freep(&s->temp_idwt_buffer); | av_freep(&s->temp_idwt_buffer); | ||||
av_freep(&s->run_buffer); | |||||
s->m.me.temp= NULL; | s->m.me.temp= NULL; | ||||
av_freep(&s->m.me.scratchpad); | av_freep(&s->m.me.scratchpad); | ||||
@@ -641,6 +651,7 @@ av_cold void ff_snow_common_end(SnowContext *s) | |||||
av_freep(&s->block); | av_freep(&s->block); | ||||
av_freep(&s->scratchbuf); | av_freep(&s->scratchbuf); | ||||
av_freep(&s->emu_edge_buffer); | |||||
for(i=0; i<MAX_REF_FRAMES; i++){ | for(i=0; i<MAX_REF_FRAMES; i++){ | ||||
av_freep(&s->ref_mvs[i]); | av_freep(&s->ref_mvs[i]); | ||||
@@ -135,6 +135,7 @@ typedef struct SnowContext{ | |||||
DWTELEM *temp_dwt_buffer; | DWTELEM *temp_dwt_buffer; | ||||
IDWTELEM *spatial_idwt_buffer; | IDWTELEM *spatial_idwt_buffer; | ||||
IDWTELEM *temp_idwt_buffer; | IDWTELEM *temp_idwt_buffer; | ||||
int *run_buffer; | |||||
int colorspace_type; | int colorspace_type; | ||||
int chroma_h_shift; | int chroma_h_shift; | ||||
int chroma_v_shift; | int chroma_v_shift; | ||||
@@ -165,7 +166,7 @@ typedef struct SnowContext{ | |||||
MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to eventually make the motion estimation independent of MpegEncContext, so this will be removed then (FIXME/XXX) | MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to eventually make the motion estimation independent of MpegEncContext, so this will be removed then (FIXME/XXX) | ||||
uint8_t *scratchbuf; | uint8_t *scratchbuf; | ||||
int *runs; | |||||
uint8_t *emu_edge_buffer; | |||||
}SnowContext; | }SnowContext; | ||||
/* Tables */ | /* Tables */ | ||||
@@ -365,7 +365,12 @@ static int decode_header(SnowContext *s){ | |||||
static av_cold int decode_init(AVCodecContext *avctx) | static av_cold int decode_init(AVCodecContext *avctx) | ||||
{ | { | ||||
ff_snow_common_init(avctx); | |||||
int ret; | |||||
if ((ret = ff_snow_common_init(avctx)) < 0) { | |||||
ff_snow_common_end(avctx->priv_data); | |||||
return ret; | |||||
} | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -156,7 +156,7 @@ static void dwt_quantize(SnowContext *s, Plane *p, DWTELEM *buffer, int width, i | |||||
static av_cold int encode_init(AVCodecContext *avctx) | static av_cold int encode_init(AVCodecContext *avctx) | ||||
{ | { | ||||
SnowContext *s = avctx->priv_data; | SnowContext *s = avctx->priv_data; | ||||
int plane_index; | |||||
int plane_index, ret; | |||||
if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ | if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ | ||||
av_log(avctx, AV_LOG_ERROR, "This codec is under development, files encoded with it may not be decodable with future versions!!!\n" | av_log(avctx, AV_LOG_ERROR, "This codec is under development, files encoded with it may not be decodable with future versions!!!\n" | ||||
@@ -185,7 +185,10 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
s->plane[plane_index].fast_mc= 1; | s->plane[plane_index].fast_mc= 1; | ||||
} | } | ||||
ff_snow_common_init(avctx); | |||||
if ((ret = ff_snow_common_init(avctx)) < 0) { | |||||
ff_snow_common_end(avctx->priv_data); | |||||
return ret; | |||||
} | |||||
ff_snow_alloc_blocks(s); | ff_snow_alloc_blocks(s); | ||||
s->version=0; | s->version=0; | ||||
@@ -246,8 +249,6 @@ static av_cold int encode_init(AVCodecContext *avctx) | |||||
} | } | ||||
} | } | ||||
s->runs = av_malloc(avctx->width * avctx->height * sizeof(*s->runs)); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -677,7 +678,7 @@ static int get_block_rd(SnowContext *s, int mb_x, int mb_y, int plane_index, uin | |||||
uint8_t *src= s-> input_picture.data[plane_index]; | uint8_t *src= s-> input_picture.data[plane_index]; | ||||
IDWTELEM *pred= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; | IDWTELEM *pred= (IDWTELEM*)s->m.obmc_scratchpad + plane_index*block_size*block_size*4; | ||||
uint8_t *cur = s->scratchbuf; | uint8_t *cur = s->scratchbuf; | ||||
uint8_t tmp[ref_stride*(2*MB_SIZE+HTAPS_MAX-1)]; | |||||
uint8_t *tmp = s->emu_edge_buffer; | |||||
const int b_stride = s->b_width << s->block_max_depth; | const int b_stride = s->b_width << s->block_max_depth; | ||||
const int b_height = s->b_height<< s->block_max_depth; | const int b_height = s->b_height<< s->block_max_depth; | ||||
const int w= p->width; | const int w= p->width; | ||||
@@ -843,6 +844,7 @@ static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, | |||||
if(1){ | if(1){ | ||||
int run=0; | int run=0; | ||||
int *runs = s->run_buffer; | |||||
int run_index=0; | int run_index=0; | ||||
int max_index; | int max_index; | ||||
@@ -876,7 +878,7 @@ static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, | |||||
} | } | ||||
if(!(/*ll|*/l|lt|t|rt|p)){ | if(!(/*ll|*/l|lt|t|rt|p)){ | ||||
if(v){ | if(v){ | ||||
s->runs[run_index++]= run; | |||||
runs[run_index++]= run; | |||||
run=0; | run=0; | ||||
}else{ | }else{ | ||||
run++; | run++; | ||||
@@ -885,9 +887,9 @@ static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, | |||||
} | } | ||||
} | } | ||||
max_index= run_index; | max_index= run_index; | ||||
s->runs[run_index++]= run; | |||||
runs[run_index++]= run; | |||||
run_index=0; | run_index=0; | ||||
run= s->runs[run_index++]; | |||||
run= runs[run_index++]; | |||||
put_symbol2(&s->c, b->state[30], max_index, 0); | put_symbol2(&s->c, b->state[30], max_index, 0); | ||||
if(run_index <= max_index) | if(run_index <= max_index) | ||||
@@ -931,7 +933,7 @@ static int encode_subband_c0run(SnowContext *s, SubBand *b, const IDWTELEM *src, | |||||
put_rac(&s->c, &b->state[0][context], !!v); | put_rac(&s->c, &b->state[0][context], !!v); | ||||
}else{ | }else{ | ||||
if(!run){ | if(!run){ | ||||
run= s->runs[run_index++]; | |||||
run= runs[run_index++]; | |||||
if(run_index <= max_index) | if(run_index <= max_index) | ||||
put_symbol2(&s->c, b->state[1], run, 3); | put_symbol2(&s->c, b->state[1], run, 3); | ||||
@@ -1909,7 +1911,6 @@ static av_cold int encode_end(AVCodecContext *avctx) | |||||
if (s->input_picture.data[0]) | if (s->input_picture.data[0]) | ||||
avctx->release_buffer(avctx, &s->input_picture); | avctx->release_buffer(avctx, &s->input_picture); | ||||
av_free(avctx->stats_out); | av_free(avctx->stats_out); | ||||
av_freep(&s->runs); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -41,7 +41,7 @@ | |||||
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) | #define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) | ||||
/** | /** | ||||
* Those FF_API_* defines are not part of public API. | |||||
* These FF_API_* defines are not part of the public API. | |||||
* They may change, break or disappear at any time. | * They may change, break or disappear at any time. | ||||
*/ | */ | ||||
#ifndef FF_API_REQUEST_CHANNELS | #ifndef FF_API_REQUEST_CHANNELS | ||||
@@ -147,7 +147,7 @@ struct xvmc_pix_fmt { | |||||
*/ | */ | ||||
int filled_mv_blocks_num; | int filled_mv_blocks_num; | ||||
/** Number of the the next free data block; one data block consists of | |||||
/** Number of the next free data block; one data block consists of | |||||
64 short values in the data_blocks array. | 64 short values in the data_blocks array. | ||||
All blocks before this one have already been claimed by placing their | All blocks before this one have already been claimed by placing their | ||||
position into the corresponding block description structure field, | position into the corresponding block description structure field, | ||||
@@ -221,4 +221,4 @@ void ff_formats_unref(AVFilterFormats **ref); | |||||
*/ | */ | ||||
void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref); | void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref); | ||||
#endif // AVFILTER_FORMATS_H | |||||
#endif /* AVFILTER_FORMATS_H */ |
@@ -41,7 +41,7 @@ | |||||
#define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT | #define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT | ||||
/** | /** | ||||
* Those FF_API_* defines are not part of public API. | |||||
* These FF_API_* defines are not part of the public API. | |||||
* They may change, break or disappear at any time. | * They may change, break or disappear at any time. | ||||
*/ | */ | ||||
#ifndef FF_API_OLD_ALL_FORMATS_API | #ifndef FF_API_OLD_ALL_FORMATS_API | ||||
@@ -60,4 +60,4 @@ | |||||
#define FF_API_BUFFERSRC_BUFFER (LIBAVFILTER_VERSION_MAJOR < 4) | #define FF_API_BUFFERSRC_BUFFER (LIBAVFILTER_VERSION_MAJOR < 4) | ||||
#endif | #endif | ||||
#endif // AVFILTER_VERSION_H | |||||
#endif /* AVFILTER_VERSION_H */ |
@@ -26,9 +26,9 @@ | |||||
DECLARE_ALIGNED(16, static const uint16_t, pw_7f)[8] = {0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F}; | DECLARE_ALIGNED(16, static const uint16_t, pw_7f)[8] = {0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F}; | ||||
DECLARE_ALIGNED(16, static const uint16_t, pw_ff)[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; | DECLARE_ALIGNED(16, static const uint16_t, pw_ff)[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; | ||||
#if HAVE_MMX2 | |||||
static void gradfun_filter_line_mmx2(uint8_t *dst, const uint8_t *src, const uint16_t *dc, int width, int thresh, const uint16_t *dithers) | static void gradfun_filter_line_mmx2(uint8_t *dst, const uint8_t *src, const uint16_t *dc, int width, int thresh, const uint16_t *dithers) | ||||
{ | { | ||||
#if HAVE_MMX2 | |||||
intptr_t x; | intptr_t x; | ||||
if (width & 3) { | if (width & 3) { | ||||
x = width & ~3; | x = width & ~3; | ||||
@@ -71,12 +71,12 @@ static void gradfun_filter_line_mmx2(uint8_t *dst, const uint8_t *src, const uin | |||||
"rm"(thresh), "m"(*dithers), "m"(*pw_7f) | "rm"(thresh), "m"(*dithers), "m"(*pw_7f) | ||||
:"memory" | :"memory" | ||||
); | ); | ||||
#endif | |||||
} | } | ||||
#endif | |||||
#if HAVE_SSSE3 | |||||
static void gradfun_filter_line_ssse3(uint8_t *dst, const uint8_t *src, const uint16_t *dc, int width, int thresh, const uint16_t *dithers) | static void gradfun_filter_line_ssse3(uint8_t *dst, const uint8_t *src, const uint16_t *dc, int width, int thresh, const uint16_t *dithers) | ||||
{ | { | ||||
#if HAVE_SSSE3 | |||||
intptr_t x; | intptr_t x; | ||||
if (width & 7) { | if (width & 7) { | ||||
// could be 10% faster if I somehow eliminated this | // could be 10% faster if I somehow eliminated this | ||||
@@ -118,12 +118,12 @@ static void gradfun_filter_line_ssse3(uint8_t *dst, const uint8_t *src, const ui | |||||
"rm"(thresh), "m"(*dithers), "m"(*pw_7f) | "rm"(thresh), "m"(*dithers), "m"(*pw_7f) | ||||
:"memory" | :"memory" | ||||
); | ); | ||||
#endif // HAVE_SSSE3 | |||||
} | } | ||||
#endif // HAVE_SSSE3 | |||||
#if HAVE_SSE | |||||
static void gradfun_blur_line_sse2(uint16_t *dc, uint16_t *buf, const uint16_t *buf1, const uint8_t *src, int src_linesize, int width) | static void gradfun_blur_line_sse2(uint16_t *dc, uint16_t *buf, const uint16_t *buf1, const uint8_t *src, int src_linesize, int width) | ||||
{ | { | ||||
#if HAVE_SSE | |||||
#define BLURV(load)\ | #define BLURV(load)\ | ||||
intptr_t x = -2*width;\ | intptr_t x = -2*width;\ | ||||
__asm__ volatile(\ | __asm__ volatile(\ | ||||
@@ -161,17 +161,23 @@ static void gradfun_blur_line_sse2(uint16_t *dc, uint16_t *buf, const uint16_t * | |||||
} else { | } else { | ||||
BLURV("movdqa"); | BLURV("movdqa"); | ||||
} | } | ||||
#endif // HAVE_SSE | |||||
} | } | ||||
#endif // HAVE_SSE | |||||
av_cold void ff_gradfun_init_x86(GradFunContext *gf) | av_cold void ff_gradfun_init_x86(GradFunContext *gf) | ||||
{ | { | ||||
int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
if (HAVE_MMX2 && cpu_flags & AV_CPU_FLAG_MMX2) | |||||
#if HAVE_MMX2 | |||||
if (cpu_flags & AV_CPU_FLAG_MMX2) | |||||
gf->filter_line = gradfun_filter_line_mmx2; | gf->filter_line = gradfun_filter_line_mmx2; | ||||
if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3) | |||||
#endif | |||||
#if HAVE_SSSE3 | |||||
if (cpu_flags & AV_CPU_FLAG_SSSE3) | |||||
gf->filter_line = gradfun_filter_line_ssse3; | gf->filter_line = gradfun_filter_line_ssse3; | ||||
if (HAVE_SSE && cpu_flags & AV_CPU_FLAG_SSE2) | |||||
#endif | |||||
#if HAVE_SSE | |||||
if (cpu_flags & AV_CPU_FLAG_SSE2) | |||||
gf->blur_line = gradfun_blur_line_sse2; | gf->blur_line = gradfun_blur_line_sse2; | ||||
#endif | |||||
} | } |
@@ -24,10 +24,6 @@ | |||||
#include "libavcodec/x86/dsputil_mmx.h" | #include "libavcodec/x86/dsputil_mmx.h" | ||||
#include "libavfilter/yadif.h" | #include "libavfilter/yadif.h" | ||||
static void yadif_filter_line_ssse3(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode); | |||||
static void yadif_filter_line_sse2(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode); | |||||
static void yadif_filter_line_mmx(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode); | |||||
DECLARE_ASM_CONST(16, const xmm_reg, pb_1) = {0x0101010101010101ULL, 0x0101010101010101ULL}; | DECLARE_ASM_CONST(16, const xmm_reg, pb_1) = {0x0101010101010101ULL, 0x0101010101010101ULL}; | ||||
DECLARE_ASM_CONST(16, const xmm_reg, pw_1) = {0x0001000100010001ULL, 0x0001000100010001ULL}; | DECLARE_ASM_CONST(16, const xmm_reg, pw_1) = {0x0001000100010001ULL, 0x0001000100010001ULL}; | ||||
@@ -57,10 +53,16 @@ av_cold void ff_yadif_init_x86(YADIFContext *yadif) | |||||
{ | { | ||||
int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) | |||||
#if HAVE_MMX | |||||
if (cpu_flags & AV_CPU_FLAG_MMX) | |||||
yadif->filter_line = yadif_filter_line_mmx; | yadif->filter_line = yadif_filter_line_mmx; | ||||
if (HAVE_SSE && cpu_flags & AV_CPU_FLAG_SSE2) | |||||
#endif | |||||
#if HAVE_SSE | |||||
if (cpu_flags & AV_CPU_FLAG_SSE2) | |||||
yadif->filter_line = yadif_filter_line_sse2; | yadif->filter_line = yadif_filter_line_sse2; | ||||
if (HAVE_SSSE3 && cpu_flags & AV_CPU_FLAG_SSSE3) | |||||
#endif | |||||
#if HAVE_SSSE3 | |||||
if (cpu_flags & AV_CPU_FLAG_SSSE3) | |||||
yadif->filter_line = yadif_filter_line_ssse3; | yadif->filter_line = yadif_filter_line_ssse3; | ||||
#endif | |||||
} | } |
@@ -76,6 +76,59 @@ static AVStream *create_stream(AVFormatContext *s, int tag, int codec_type){ | |||||
avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ | avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ | ||||
return st; | return st; | ||||
} | } | ||||
static int flv_same_audio_codec(AVCodecContext *acodec, int flags) | |||||
{ | |||||
int bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; | |||||
int flv_codecid = flags & FLV_AUDIO_CODECID_MASK; | |||||
int codec_id; | |||||
if (!acodec->codec_id && !acodec->codec_tag) | |||||
return 1; | |||||
if (acodec->bits_per_coded_sample != bits_per_coded_sample) | |||||
return 0; | |||||
switch(flv_codecid) { | |||||
//no distinction between S16 and S8 PCM codec flags | |||||
case FLV_CODECID_PCM: | |||||
codec_id = bits_per_coded_sample == 8 ? CODEC_ID_PCM_U8 : | |||||
#if HAVE_BIGENDIAN | |||||
CODEC_ID_PCM_S16BE; | |||||
#else | |||||
CODEC_ID_PCM_S16LE; | |||||
#endif | |||||
return codec_id == acodec->codec_id; | |||||
case FLV_CODECID_PCM_LE: | |||||
codec_id = bits_per_coded_sample == 8 ? CODEC_ID_PCM_U8 : CODEC_ID_PCM_S16LE; | |||||
return codec_id == acodec->codec_id; | |||||
case FLV_CODECID_AAC: | |||||
return acodec->codec_id == CODEC_ID_AAC; | |||||
case FLV_CODECID_ADPCM: | |||||
return acodec->codec_id == CODEC_ID_ADPCM_SWF; | |||||
case FLV_CODECID_SPEEX: | |||||
return acodec->codec_id == CODEC_ID_SPEEX; | |||||
case FLV_CODECID_MP3: | |||||
return acodec->codec_id == CODEC_ID_MP3; | |||||
case FLV_CODECID_NELLYMOSER_8KHZ_MONO: | |||||
return acodec->sample_rate == 8000 && | |||||
acodec->codec_id == CODEC_ID_NELLYMOSER; | |||||
case FLV_CODECID_NELLYMOSER_16KHZ_MONO: | |||||
return acodec->sample_rate == 16000 && | |||||
acodec->codec_id == CODEC_ID_NELLYMOSER; | |||||
case FLV_CODECID_NELLYMOSER: | |||||
return acodec->codec_id == CODEC_ID_NELLYMOSER; | |||||
case FLV_CODECID_PCM_MULAW: | |||||
return acodec->sample_rate == 8000 && | |||||
acodec->codec_id == CODEC_ID_PCM_MULAW; | |||||
case FLV_CODECID_PCM_ALAW: | |||||
return acodec->sample_rate = 8000 && | |||||
acodec->codec_id == CODEC_ID_PCM_ALAW; | |||||
default: | |||||
return acodec->codec_tag == (flv_codecid >> FLV_AUDIO_CODECID_OFFSET); | |||||
} | |||||
return 0; | |||||
} | |||||
static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, AVCodecContext *acodec, int flv_codecid) { | static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, AVCodecContext *acodec, int flv_codecid) { | ||||
switch(flv_codecid) { | switch(flv_codecid) { | ||||
@@ -122,6 +175,33 @@ static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, AVCodecCo | |||||
} | } | ||||
} | } | ||||
static int flv_same_video_codec(AVCodecContext *vcodec, int flags) | |||||
{ | |||||
int flv_codecid = flags & FLV_VIDEO_CODECID_MASK; | |||||
if (!vcodec->codec_id && !vcodec->codec_tag) | |||||
return 1; | |||||
switch (flv_codecid) { | |||||
case FLV_CODECID_H263: | |||||
return vcodec->codec_id == CODEC_ID_FLV1; | |||||
case FLV_CODECID_SCREEN: | |||||
return vcodec->codec_id == CODEC_ID_FLASHSV; | |||||
case FLV_CODECID_SCREEN2: | |||||
return vcodec->codec_id == CODEC_ID_FLASHSV2; | |||||
case FLV_CODECID_VP6: | |||||
return vcodec->codec_id == CODEC_ID_VP6F; | |||||
case FLV_CODECID_VP6A: | |||||
return vcodec->codec_id == CODEC_ID_VP6A; | |||||
case FLV_CODECID_H264: | |||||
return vcodec->codec_id == CODEC_ID_H264; | |||||
default: | |||||
return vcodec->codec_tag == flv_codecid; | |||||
} | |||||
return 0; | |||||
} | |||||
static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid) { | static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid) { | ||||
AVCodecContext *vcodec = vstream->codec; | AVCodecContext *vcodec = vstream->codec; | ||||
switch(flv_codecid) { | switch(flv_codecid) { | ||||
@@ -516,7 +596,7 @@ static int flv_data_packet(AVFormatContext *s, AVPacket *pkt, | |||||
for (i = 0; i < s->nb_streams; i++) { | for (i = 0; i < s->nb_streams; i++) { | ||||
st = s->streams[i]; | st = s->streams[i]; | ||||
if (st->id == 2) | |||||
if (st->codec->codec_type == AVMEDIA_TYPE_DATA) | |||||
break; | break; | ||||
} | } | ||||
@@ -616,8 +696,18 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
/* now find stream */ | /* now find stream */ | ||||
for(i=0;i<s->nb_streams;i++) { | for(i=0;i<s->nb_streams;i++) { | ||||
st = s->streams[i]; | st = s->streams[i]; | ||||
if (st->id == stream_type) | |||||
if (stream_type == FLV_STREAM_TYPE_AUDIO && st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { | |||||
if (flv_same_audio_codec(st->codec, flags)) { | |||||
break; | |||||
} | |||||
} else | |||||
if (stream_type == FLV_STREAM_TYPE_VIDEO && st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { | |||||
if (flv_same_video_codec(st->codec, flags)) { | |||||
break; | |||||
} | |||||
} else if (st->id == stream_type) { | |||||
break; | break; | ||||
} | |||||
} | } | ||||
if(i == s->nb_streams){ | if(i == s->nb_streams){ | ||||
av_log(s, AV_LOG_WARNING, "Stream discovered after head already parsed\n"); | av_log(s, AV_LOG_WARNING, "Stream discovered after head already parsed\n"); | ||||
@@ -77,7 +77,7 @@ enum CodecID ff_rtp_codec_id(const char *buf, enum AVMediaType codec_type); | |||||
#define RTCP_TX_RATIO_DEN 1000 | #define RTCP_TX_RATIO_DEN 1000 | ||||
/* An arbitrary id value for RTP Xiph streams - only relevant to indicate | /* An arbitrary id value for RTP Xiph streams - only relevant to indicate | ||||
* the the configuration has changed within a stream (by changing the | |||||
* that the configuration has changed within a stream (by changing the | |||||
* ident value sent). | * ident value sent). | ||||
*/ | */ | ||||
#define RTP_XIPH_IDENT 0xfecdba | #define RTP_XIPH_IDENT 0xfecdba | ||||
@@ -44,7 +44,7 @@ | |||||
#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) | #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) | ||||
/** | /** | ||||
* Those FF_API_* defines are not part of public API. | |||||
* These FF_API_* defines are not part of the public API. | |||||
* They may change, break or disappear at any time. | * They may change, break or disappear at any time. | ||||
*/ | */ | ||||
#ifndef FF_API_OLD_AVIO | #ifndef FF_API_OLD_AVIO | ||||
@@ -75,7 +75,6 @@ static av_always_inline av_const int16_t av_clip_int16_arm(int a) | |||||
return x; | return x; | ||||
} | } | ||||
#if !CONFIG_SMALL //the code below cannot be compiled without always_inline | |||||
#define av_clip_uintp2 av_clip_uintp2_arm | #define av_clip_uintp2 av_clip_uintp2_arm | ||||
static av_always_inline av_const unsigned av_clip_uintp2_arm(int a, int p) | static av_always_inline av_const unsigned av_clip_uintp2_arm(int a, int p) | ||||
{ | { | ||||
@@ -83,7 +82,7 @@ static av_always_inline av_const unsigned av_clip_uintp2_arm(int a, int p) | |||||
__asm__ ("usat %0, %2, %1" : "=r"(x) : "r"(a), "i"(p)); | __asm__ ("usat %0, %2, %1" : "=r"(x) : "r"(a), "i"(p)); | ||||
return x; | return x; | ||||
} | } | ||||
#endif //!CONFIG_SMALL | |||||
#else /* HAVE_ARMV6 */ | #else /* HAVE_ARMV6 */ | ||||
@@ -50,65 +50,45 @@ | |||||
#endif | #endif | ||||
#endif | #endif | ||||
#ifndef av_noreturn | |||||
#if AV_GCC_VERSION_AT_LEAST(2,5) | |||||
# define av_noreturn __attribute__((noreturn)) | |||||
#else | |||||
# define av_noreturn | |||||
#endif | |||||
#endif | |||||
#ifndef av_noinline | |||||
#if AV_GCC_VERSION_AT_LEAST(3,1) | #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
# define av_noinline __attribute__((noinline)) | # define av_noinline __attribute__((noinline)) | ||||
#else | #else | ||||
# define av_noinline | # define av_noinline | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef av_pure | |||||
#if AV_GCC_VERSION_AT_LEAST(3,1) | #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
# define av_pure __attribute__((pure)) | # define av_pure __attribute__((pure)) | ||||
#else | #else | ||||
# define av_pure | # define av_pure | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef av_restrict | #ifndef av_restrict | ||||
#define av_restrict restrict | #define av_restrict restrict | ||||
#endif | #endif | ||||
#ifndef av_const | |||||
#if AV_GCC_VERSION_AT_LEAST(2,6) | #if AV_GCC_VERSION_AT_LEAST(2,6) | ||||
# define av_const __attribute__((const)) | # define av_const __attribute__((const)) | ||||
#else | #else | ||||
# define av_const | # define av_const | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef av_cold | |||||
#if AV_GCC_VERSION_AT_LEAST(4,3) | #if AV_GCC_VERSION_AT_LEAST(4,3) | ||||
# define av_cold __attribute__((cold)) | # define av_cold __attribute__((cold)) | ||||
#else | #else | ||||
# define av_cold | # define av_cold | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef av_flatten | |||||
#if AV_GCC_VERSION_AT_LEAST(4,1) | #if AV_GCC_VERSION_AT_LEAST(4,1) | ||||
# define av_flatten __attribute__((flatten)) | # define av_flatten __attribute__((flatten)) | ||||
#else | #else | ||||
# define av_flatten | # define av_flatten | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef attribute_deprecated | |||||
#if AV_GCC_VERSION_AT_LEAST(3,1) | #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
# define attribute_deprecated __attribute__((deprecated)) | # define attribute_deprecated __attribute__((deprecated)) | ||||
#else | #else | ||||
# define attribute_deprecated | # define attribute_deprecated | ||||
#endif | #endif | ||||
#endif | |||||
/** | /** | ||||
* Disable warnings about deprecated features | * Disable warnings about deprecated features | ||||
@@ -128,42 +108,34 @@ | |||||
#endif | #endif | ||||
#ifndef av_unused | |||||
#if defined(__GNUC__) | #if defined(__GNUC__) | ||||
# define av_unused __attribute__((unused)) | # define av_unused __attribute__((unused)) | ||||
#else | #else | ||||
# define av_unused | # define av_unused | ||||
#endif | #endif | ||||
#endif | |||||
/** | /** | ||||
* Mark a variable as used and prevent the compiler from optimizing it | * Mark a variable as used and prevent the compiler from optimizing it | ||||
* away. This is useful for variables accessed only from inline | * away. This is useful for variables accessed only from inline | ||||
* assembler without the compiler being aware. | * assembler without the compiler being aware. | ||||
*/ | */ | ||||
#ifndef av_used | |||||
#if AV_GCC_VERSION_AT_LEAST(3,1) | #if AV_GCC_VERSION_AT_LEAST(3,1) | ||||
# define av_used __attribute__((used)) | # define av_used __attribute__((used)) | ||||
#else | #else | ||||
# define av_used | # define av_used | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef av_alias | |||||
#if AV_GCC_VERSION_AT_LEAST(3,3) | #if AV_GCC_VERSION_AT_LEAST(3,3) | ||||
# define av_alias __attribute__((may_alias)) | # define av_alias __attribute__((may_alias)) | ||||
#else | #else | ||||
# define av_alias | # define av_alias | ||||
#endif | #endif | ||||
#endif | |||||
#ifndef av_uninit | |||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER) | #if defined(__GNUC__) && !defined(__INTEL_COMPILER) | ||||
# define av_uninit(x) x=x | # define av_uninit(x) x=x | ||||
#else | #else | ||||
# define av_uninit(x) x | # define av_uninit(x) x | ||||
#endif | #endif | ||||
#endif | |||||
#ifdef __GNUC__ | #ifdef __GNUC__ | ||||
# define av_builtin_constant_p __builtin_constant_p | # define av_builtin_constant_p __builtin_constant_p | ||||
@@ -173,4 +145,10 @@ | |||||
# define av_printf_format(fmtpos, attrpos) | # define av_printf_format(fmtpos, attrpos) | ||||
#endif | #endif | ||||
#if AV_GCC_VERSION_AT_LEAST(2,5) | |||||
# define av_noreturn __attribute__((noreturn)) | |||||
#else | |||||
# define av_noreturn | |||||
#endif | |||||
#endif /* AVUTIL_ATTRIBUTES_H */ | #endif /* AVUTIL_ATTRIBUTES_H */ |
@@ -124,4 +124,4 @@ void av_dict_free(AVDictionary **m); | |||||
* @} | * @} | ||||
*/ | */ | ||||
#endif // AVUTIL_DICT_H | |||||
#endif /* AVUTIL_DICT_H */ |
@@ -67,7 +67,8 @@ $EGREP $OPT '^\+ *(const *|)static' $*| $EGREP --color=always '[^=]= *(0|NULL)[^ | |||||
cat $TMP | cat $TMP | ||||
hiegrep '# *ifdef * (HAVE|CONFIG)_' 'ifdefs that should be #if' $* | hiegrep '# *ifdef * (HAVE|CONFIG)_' 'ifdefs that should be #if' $* | ||||
hiegrep '\b(awnser|cant|dont|wont|usefull|successfull|occured|teh|alot|wether|skiped|heigth|informations|colums|loosy|loosing|ouput|seperate|preceed|upto|paket|posible|unkown|inpossible|dimention|funtions|overriden|outputing|seperation|initalize|compatibilty)\b' 'common typos' $* | |||||
hiegrep '\b(awnser|cant|dont|wont|usefull|successfull|occured|teh|alot|wether|skiped|heigth|informations|colums|loosy|loosing|ouput|seperate|preceed|upto|paket|posible|unkown|inpossible|dimention|acheive|funtions|overriden|outputing|seperation|initalize|compatibilty)\b' 'common typos' $* | |||||
hiegrep 'av_log\( *NULL' 'Missing context in av_log' $* | hiegrep 'av_log\( *NULL' 'Missing context in av_log' $* | ||||
hiegrep '[^sn]printf' 'Please use av_log' $* | hiegrep '[^sn]printf' 'Please use av_log' $* | ||||
hiegrep '\bmalloc' 'Please use av_malloc' $* | hiegrep '\bmalloc' 'Please use av_malloc' $* | ||||