mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-08-03 22:50:36 +00:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: rtpdec: Use our own SSRC in the SDES field when sending RRs Finalize changelog for 0.8 Release Prepare for 0.8 Release threads: change the default for threads back to 1 threads: update slice_count and slice_offset from user context aviocat: Remove useless includes doc/APIChanges: fill in missing dates and hashes Revert "avserver: fix build after the next bump." mpegaudiodec: switch error detection check to AV_EF_BUFFER lavf: rename fer option and document resulting (f_)err_detect options lavc: rename err_filter option to err_detect and document it mpegvideo: fix invalid memory access for small video dimensions movenc: Reorder entries in the MOVIentry struct, for tigheter packing rtsp: Remove extern declarations for variables that don't exist aviocat: Flush the output before closing Conflicts: Changelog RELEASE libavcodec/mpegaudiodec.c libavcodec/pthread.c libavformat/options.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -987,10 +987,10 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
|
||||
/* skip extension bits */
|
||||
bits_left = end_pos2 - get_bits_count(&s->gb);
|
||||
//av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer);
|
||||
if (bits_left < 0 && (s->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT))) {
|
||||
if (bits_left < 0 && (s->err_recognition & (AV_EF_BUFFER|AV_EF_COMPLIANT))) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left);
|
||||
s_index=0;
|
||||
} else if (bits_left > 0 && (s->err_recognition & (AV_EF_BITSTREAM|AV_EF_AGGRESSIVE))) {
|
||||
} else if (bits_left > 0 && (s->err_recognition & (AV_EF_BUFFER|AV_EF_AGGRESSIVE))) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left);
|
||||
s_index = 0;
|
||||
}
|
||||
|
||||
@@ -1805,8 +1805,8 @@ static inline int hpel_motion_lowres(MpegEncContext *s,
|
||||
|
||||
src += src_y * stride + src_x;
|
||||
|
||||
if ((unsigned)src_x > h_edge_pos - (!!sx) - w ||
|
||||
(unsigned)src_y > (v_edge_pos >> field_based) - (!!sy) - h) {
|
||||
if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
|
||||
(unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
|
||||
(h + 1) << field_based, src_x,
|
||||
src_y << field_based,
|
||||
@@ -1907,8 +1907,8 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
|
||||
ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
|
||||
ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
|
||||
|
||||
if ((unsigned) src_x > h_edge_pos - (!!sx) - 2 * block_s ||
|
||||
(unsigned) src_y > (v_edge_pos >> field_based) - (!!sy) - h) {
|
||||
if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) ||
|
||||
(unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
|
||||
s->linesize, 17, 17 + field_based,
|
||||
src_x, src_y << field_based, h_edge_pos,
|
||||
@@ -1990,8 +1990,8 @@ static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
|
||||
offset = src_y * s->uvlinesize + src_x;
|
||||
ptr = ref_picture[1] + offset;
|
||||
if (s->flags & CODEC_FLAG_EMU_EDGE) {
|
||||
if ((unsigned) src_x > h_edge_pos - (!!sx) - block_s ||
|
||||
(unsigned) src_y > v_edge_pos - (!!sy) - block_s) {
|
||||
if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
|
||||
(unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
|
||||
9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
|
||||
ptr = s->edge_emu_buffer;
|
||||
|
||||
@@ -81,8 +81,8 @@ static inline void gmc1_motion(MpegEncContext *s,
|
||||
ptr = ref_picture[0] + (src_y * linesize) + src_x;
|
||||
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x >= s->h_edge_pos - 17
|
||||
|| (unsigned)src_y >= s->v_edge_pos - 17){
|
||||
if( (unsigned)src_x >= FFMAX(s->h_edge_pos - 17, 0)
|
||||
|| (unsigned)src_y >= FFMAX(s->v_edge_pos - 17, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
|
||||
ptr= s->edge_emu_buffer;
|
||||
}
|
||||
@@ -120,8 +120,8 @@ static inline void gmc1_motion(MpegEncContext *s,
|
||||
offset = (src_y * uvlinesize) + src_x;
|
||||
ptr = ref_picture[1] + offset;
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
|
||||
|| (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
|
||||
if( (unsigned)src_x >= FFMAX((s->h_edge_pos>>1) - 9, 0)
|
||||
|| (unsigned)src_y >= FFMAX((s->v_edge_pos>>1) - 9, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
ptr= s->edge_emu_buffer;
|
||||
emu=1;
|
||||
@@ -221,8 +221,8 @@ static inline int hpel_motion(MpegEncContext *s,
|
||||
src += src_y * stride + src_x;
|
||||
|
||||
if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
|
||||
if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
|
||||
|| (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
|
||||
if( (unsigned)src_x > FFMAX(h_edge_pos - (motion_x&1) - w, 0)
|
||||
|| (unsigned)src_y > FFMAX(v_edge_pos - (motion_y&1) - h, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
|
||||
src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
|
||||
src= s->edge_emu_buffer;
|
||||
@@ -307,8 +307,8 @@ if(s->quarter_sample)
|
||||
ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
|
||||
ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
|
||||
|
||||
if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
|
||||
|| (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
|
||||
if( (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&1) - 16, 0)
|
||||
|| (unsigned)src_y > FFMAX( v_edge_pos - (motion_y&1) - h , 0)){
|
||||
if(is_mpeg12 || s->codec_id == CODEC_ID_MPEG2VIDEO ||
|
||||
s->codec_id == CODEC_ID_MPEG1VIDEO){
|
||||
av_log(s->avctx,AV_LOG_DEBUG,
|
||||
@@ -510,8 +510,8 @@ static inline void qpel_motion(MpegEncContext *s,
|
||||
ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
|
||||
ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
|
||||
|
||||
if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
|
||||
|| (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
|
||||
if( (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&3) - 16, 0)
|
||||
|| (unsigned)src_y > FFMAX( v_edge_pos - (motion_y&3) - h , 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
|
||||
17, 17+field_based, src_x, src_y<<field_based,
|
||||
s->h_edge_pos, s->v_edge_pos);
|
||||
@@ -588,8 +588,8 @@ static inline void chroma_4mv_motion(MpegEncContext *s,
|
||||
offset = src_y * s->uvlinesize + src_x;
|
||||
ptr = ref_picture[1] + offset;
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
|
||||
|| (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
|
||||
if( (unsigned)src_x > FFMAX((s->h_edge_pos>>1) - (dxy &1) - 8, 0)
|
||||
|| (unsigned)src_y > FFMAX((s->v_edge_pos>>1) - (dxy>>1) - 8, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
|
||||
9, 9, src_x, src_y,
|
||||
s->h_edge_pos>>1, s->v_edge_pos>>1);
|
||||
@@ -760,8 +760,8 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
|
||||
|
||||
ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
|
||||
if(s->flags&CODEC_FLAG_EMU_EDGE){
|
||||
if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
|
||||
|| (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
|
||||
if( (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&3) - 8, 0)
|
||||
|| (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y&3) - 8, 0)){
|
||||
s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr,
|
||||
s->linesize, 9, 9,
|
||||
src_x, src_y,
|
||||
|
||||
@@ -209,11 +209,11 @@ static const AVOption options[]={
|
||||
{"very_aggressive", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_ER_VERY_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"},
|
||||
{"explode", "abort decoding on error recognition", 0, AV_OPT_TYPE_CONST, {.dbl = FF_ER_EXPLODE }, INT_MIN, INT_MAX, V|D, "er"},
|
||||
#endif /* FF_API_ER */
|
||||
{"err_filter", "set error detection filter flags", OFFSET(err_recognition), AV_OPT_TYPE_FLAGS, {.dbl = AV_EF_CRCCHECK }, INT_MIN, INT_MAX, A|V|D, "err_filter"},
|
||||
{"crccheck", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_CRCCHECK }, INT_MIN, INT_MAX, V|D, "err_filter"},
|
||||
{"bitstream", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_BITSTREAM }, INT_MIN, INT_MAX, V|D, "err_filter"},
|
||||
{"buffer", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_BUFFER }, INT_MIN, INT_MAX, V|D, "err_filter"},
|
||||
{"explode", "abort decoding on minor error recognition", 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_EXPLODE }, INT_MIN, INT_MAX, V|D, "err_filter"},
|
||||
{"err_detect", "set error detection flags", OFFSET(err_recognition), AV_OPT_TYPE_FLAGS, {.dbl = AV_EF_CRCCHECK }, INT_MIN, INT_MAX, A|V|D, "err_detect"},
|
||||
{"crccheck", "verify embedded CRCs", 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_CRCCHECK }, INT_MIN, INT_MAX, V|D, "err_detect"},
|
||||
{"bitstream", "detect bitstream specification deviations", 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_BITSTREAM }, INT_MIN, INT_MAX, V|D, "err_detect"},
|
||||
{"buffer", "detect improper bitstream length", 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_BUFFER }, INT_MIN, INT_MAX, V|D, "err_detect"},
|
||||
{"explode", "abort decoding on minor error detection", 0, AV_OPT_TYPE_CONST, {.dbl = AV_EF_EXPLODE }, INT_MIN, INT_MAX, V|D, "err_detect"},
|
||||
{"has_b_frames", NULL, OFFSET(has_b_frames), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
||||
{"block_align", NULL, OFFSET(block_align), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
||||
#if FF_API_PARSE_FRAME
|
||||
@@ -373,7 +373,7 @@ static const AVOption options[]={
|
||||
{"float", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_AA_FLOAT }, INT_MIN, INT_MAX, V|D, "aa"},
|
||||
#endif
|
||||
{"qns", "quantizer noise shaping", OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 0 }, 0, INT_MAX, V|E|D, "threads"},
|
||||
{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.dbl = 1 }, 0, INT_MAX, V|E|D, "threads"},
|
||||
{"auto", "detect a good number of threads", 0, AV_OPT_TYPE_CONST, {.dbl = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"},
|
||||
{"me_threshold", "motion estimaton threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
{"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||
|
||||
@@ -420,7 +420,6 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
|
||||
|
||||
dst->has_b_frames = src->has_b_frames;
|
||||
dst->idct_algo = src->idct_algo;
|
||||
dst->slice_count = src->slice_count;
|
||||
|
||||
dst->bits_per_coded_sample = src->bits_per_coded_sample;
|
||||
dst->sample_aspect_ratio = src->sample_aspect_ratio;
|
||||
@@ -455,8 +454,9 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
|
||||
*
|
||||
* @param dst The destination context.
|
||||
* @param src The source context.
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
static void update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
|
||||
static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
|
||||
{
|
||||
#define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
|
||||
dst->flags = src->flags;
|
||||
@@ -478,6 +478,22 @@ static void update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
|
||||
dst->frame_number = src->frame_number;
|
||||
dst->reordered_opaque = src->reordered_opaque;
|
||||
dst->thread_safe_callbacks = src->thread_safe_callbacks;
|
||||
|
||||
if (src->slice_count && src->slice_offset) {
|
||||
if (dst->slice_count < src->slice_count) {
|
||||
int *tmp = av_realloc(dst->slice_offset, src->slice_count *
|
||||
sizeof(*dst->slice_offset));
|
||||
if (!tmp) {
|
||||
av_free(dst->slice_offset);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
dst->slice_offset = tmp;
|
||||
}
|
||||
memcpy(dst->slice_offset, src->slice_offset,
|
||||
src->slice_count * sizeof(*dst->slice_offset));
|
||||
}
|
||||
dst->slice_count = src->slice_count;
|
||||
return 0;
|
||||
#undef copy_fields
|
||||
}
|
||||
|
||||
@@ -588,7 +604,8 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
|
||||
*/
|
||||
|
||||
p = &fctx->threads[fctx->next_decoding];
|
||||
update_context_from_user(p->avctx, avctx);
|
||||
err = update_context_from_user(p->avctx, avctx);
|
||||
if (err) return err;
|
||||
err = submit_packet(p, avpkt);
|
||||
if (err) return err;
|
||||
|
||||
@@ -764,6 +781,7 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count)
|
||||
if (i) {
|
||||
av_freep(&p->avctx->priv_data);
|
||||
av_freep(&p->avctx->internal);
|
||||
av_freep(&p->avctx->slice_offset);
|
||||
}
|
||||
|
||||
av_freep(&p->avctx);
|
||||
|
||||
Reference in New Issue
Block a user