mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
mpegvideo: treat delayed pictures as used
This requires to move the avcodec_default_free_buffers() call to ff_MPV_common_end() since otherwise delayed pictures would get freed during a size change.
This commit is contained in:
parent
bd255f9feb
commit
6a27ae28f9
@ -95,12 +95,6 @@
|
|||||||
#define IS_REF0(a) ((a) & MB_TYPE_REF0)
|
#define IS_REF0(a) ((a) & MB_TYPE_REF0)
|
||||||
#define IS_8x8DCT(a) ((a) & MB_TYPE_8x8DCT)
|
#define IS_8x8DCT(a) ((a) & MB_TYPE_8x8DCT)
|
||||||
|
|
||||||
/**
|
|
||||||
* Value of Picture.reference when Picture is not a reference picture, but
|
|
||||||
* is held for delayed output.
|
|
||||||
*/
|
|
||||||
#define DELAYED_PIC_REF 4
|
|
||||||
|
|
||||||
#define QP_MAX_NUM (51 + 2 * 6) // The maximum supported qp
|
#define QP_MAX_NUM (51 + 2 * 6) // The maximum supported qp
|
||||||
|
|
||||||
/* NAL unit types */
|
/* NAL unit types */
|
||||||
|
@ -1008,9 +1008,6 @@ static int free_context_frame(MpegEncContext *s)
|
|||||||
for (i = 0; i < 3; i++)
|
for (i = 0; i < 3; i++)
|
||||||
av_freep(&s->visualization_buffer[i]);
|
av_freep(&s->visualization_buffer[i]);
|
||||||
|
|
||||||
if (!(s->avctx->active_thread_type & FF_THREAD_FRAME))
|
|
||||||
avcodec_default_free_buffers(s->avctx);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1126,6 +1123,9 @@ void ff_MPV_common_end(MpegEncContext *s)
|
|||||||
|
|
||||||
free_context_frame(s);
|
free_context_frame(s);
|
||||||
|
|
||||||
|
if (!(s->avctx->active_thread_type & FF_THREAD_FRAME))
|
||||||
|
avcodec_default_free_buffers(s->avctx);
|
||||||
|
|
||||||
s->context_initialized = 0;
|
s->context_initialized = 0;
|
||||||
s->last_picture_ptr =
|
s->last_picture_ptr =
|
||||||
s->next_picture_ptr =
|
s->next_picture_ptr =
|
||||||
@ -1244,7 +1244,7 @@ static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
|
|||||||
{
|
{
|
||||||
if (pic->f.data[0] == NULL)
|
if (pic->f.data[0] == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
if (pic->needs_realloc)
|
if (pic->needs_realloc && !(pic->f.reference & DELAYED_PIC_REF))
|
||||||
if (!pic->owner2 || pic->owner2 == s)
|
if (!pic->owner2 || pic->owner2 == s)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -79,6 +79,12 @@ enum OutputFormat {
|
|||||||
#define EXT_START_CODE 0x000001b5
|
#define EXT_START_CODE 0x000001b5
|
||||||
#define USER_START_CODE 0x000001b2
|
#define USER_START_CODE 0x000001b2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value of Picture.reference when Picture is not a reference picture, but
|
||||||
|
* is held for delayed output.
|
||||||
|
*/
|
||||||
|
#define DELAYED_PIC_REF 4
|
||||||
|
|
||||||
struct MpegEncContext;
|
struct MpegEncContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user