Merge commit '4e17946f10d39eec6cc03fb249ae8147373141b6'
* commit '4e17946f10d39eec6cc03fb249ae8147373141b6': mpegvideo: Rework various functions not to use MpegEncContext directly Conflicts: libavcodec/mpegvideo.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
f275f9eaee
@ -521,7 +521,7 @@ retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!s->current_picture_ptr || s->current_picture_ptr->f->data[0]) {
|
if (!s->current_picture_ptr || s->current_picture_ptr->f->data[0]) {
|
||||||
int i = ff_find_unused_picture(s, 0);
|
int i = ff_find_unused_picture(s->avctx, s->picture, 0);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return i;
|
return i;
|
||||||
s->current_picture_ptr = &s->picture[i];
|
s->current_picture_ptr = &s->picture[i];
|
||||||
|
@ -1672,21 +1672,19 @@ av_cold void ff_init_vlc_rl(RLTable *rl, unsigned static_size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void release_unused_pictures(MpegEncContext *s)
|
static void release_unused_pictures(AVCodecContext *avctx, Picture *picture)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* release non reference frames */
|
/* release non reference frames */
|
||||||
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
|
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
|
||||||
if (!s->picture[i].reference)
|
if (!picture[i].reference)
|
||||||
ff_mpeg_unref_picture(s->avctx, &s->picture[i]);
|
ff_mpeg_unref_picture(avctx, &picture[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
|
static inline int pic_is_unused(Picture *pic)
|
||||||
{
|
{
|
||||||
if (pic == s->last_picture_ptr)
|
|
||||||
return 0;
|
|
||||||
if (!pic->f->buf[0])
|
if (!pic->f->buf[0])
|
||||||
return 1;
|
return 1;
|
||||||
if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF))
|
if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF))
|
||||||
@ -1694,23 +1692,23 @@ static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_unused_picture(MpegEncContext *s, int shared)
|
static int find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (shared) {
|
if (shared) {
|
||||||
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
|
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
|
||||||
if (!s->picture[i].f->buf[0] && &s->picture[i] != s->last_picture_ptr)
|
if (!picture[i].f->buf[0])
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
|
for (i = 0; i < MAX_PICTURE_COUNT; i++) {
|
||||||
if (pic_is_unused(s, &s->picture[i]))
|
if (pic_is_unused(&picture[i]))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
av_log(s->avctx, AV_LOG_FATAL,
|
av_log(avctx, AV_LOG_FATAL,
|
||||||
"Internal error, picture buffer overflow\n");
|
"Internal error, picture buffer overflow\n");
|
||||||
/* We could return -1, but the codec would crash trying to draw into a
|
/* We could return -1, but the codec would crash trying to draw into a
|
||||||
* non-existing frame anyway. This is safer than waiting for a random crash.
|
* non-existing frame anyway. This is safer than waiting for a random crash.
|
||||||
@ -1727,15 +1725,15 @@ static int find_unused_picture(MpegEncContext *s, int shared)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ff_find_unused_picture(MpegEncContext *s, int shared)
|
int ff_find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared)
|
||||||
{
|
{
|
||||||
int ret = find_unused_picture(s, shared);
|
int ret = find_unused_picture(avctx, picture, shared);
|
||||||
|
|
||||||
if (ret >= 0 && ret < MAX_PICTURE_COUNT) {
|
if (ret >= 0 && ret < MAX_PICTURE_COUNT) {
|
||||||
if (s->picture[ret].needs_realloc) {
|
if (picture[ret].needs_realloc) {
|
||||||
s->picture[ret].needs_realloc = 0;
|
picture[ret].needs_realloc = 0;
|
||||||
ff_free_picture_tables(&s->picture[ret]);
|
ff_free_picture_tables(&picture[ret]);
|
||||||
ff_mpeg_unref_picture(s->avctx, &s->picture[ret]);
|
ff_mpeg_unref_picture(avctx, &picture[ret]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -1794,14 +1792,14 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
|
|||||||
|
|
||||||
ff_mpeg_unref_picture(s->avctx, &s->current_picture);
|
ff_mpeg_unref_picture(s->avctx, &s->current_picture);
|
||||||
|
|
||||||
release_unused_pictures(s);
|
release_unused_pictures(s->avctx, s->picture);
|
||||||
|
|
||||||
if (s->current_picture_ptr && !s->current_picture_ptr->f->buf[0]) {
|
if (s->current_picture_ptr && !s->current_picture_ptr->f->buf[0]) {
|
||||||
// we already have a unused image
|
// we already have a unused image
|
||||||
// (maybe it was set before reading the header)
|
// (maybe it was set before reading the header)
|
||||||
pic = s->current_picture_ptr;
|
pic = s->current_picture_ptr;
|
||||||
} else {
|
} else {
|
||||||
i = ff_find_unused_picture(s, 0);
|
i = ff_find_unused_picture(s->avctx, s->picture, 0);
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
||||||
return i;
|
return i;
|
||||||
@ -1871,7 +1869,7 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
|
|||||||
"allocate dummy last picture for field based first keyframe\n");
|
"allocate dummy last picture for field based first keyframe\n");
|
||||||
|
|
||||||
/* Allocate a dummy frame */
|
/* Allocate a dummy frame */
|
||||||
i = ff_find_unused_picture(s, 0);
|
i = ff_find_unused_picture(s->avctx, s->picture, 0);
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
||||||
return i;
|
return i;
|
||||||
@ -1912,7 +1910,7 @@ int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
|
|||||||
if ((!s->next_picture_ptr || !s->next_picture_ptr->f->buf[0]) &&
|
if ((!s->next_picture_ptr || !s->next_picture_ptr->f->buf[0]) &&
|
||||||
s->pict_type == AV_PICTURE_TYPE_B) {
|
s->pict_type == AV_PICTURE_TYPE_B) {
|
||||||
/* Allocate a dummy frame */
|
/* Allocate a dummy frame */
|
||||||
i = ff_find_unused_picture(s, 0);
|
i = ff_find_unused_picture(s->avctx, s->picture, 0);
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
|
||||||
return i;
|
return i;
|
||||||
|
@ -780,7 +780,8 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_
|
|||||||
int ff_mpv_export_qp_table(MpegEncContext *s, AVFrame *f, Picture *p, int qp_type);
|
int ff_mpv_export_qp_table(MpegEncContext *s, AVFrame *f, Picture *p, int qp_type);
|
||||||
|
|
||||||
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix);
|
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix);
|
||||||
int ff_find_unused_picture(MpegEncContext *s, int shared);
|
|
||||||
|
int ff_find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared);
|
||||||
int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src);
|
int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src);
|
||||||
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src);
|
int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src);
|
||||||
void ff_set_qscale(MpegEncContext * s, int qscale);
|
void ff_set_qscale(MpegEncContext * s, int qscale);
|
||||||
|
@ -1131,7 +1131,7 @@ static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
|
|||||||
ff_dlog(s->avctx, "%d %d %"PTRDIFF_SPECIFIER" %"PTRDIFF_SPECIFIER"\n", pic_arg->linesize[0],
|
ff_dlog(s->avctx, "%d %d %"PTRDIFF_SPECIFIER" %"PTRDIFF_SPECIFIER"\n", pic_arg->linesize[0],
|
||||||
pic_arg->linesize[1], s->linesize, s->uvlinesize);
|
pic_arg->linesize[1], s->linesize, s->uvlinesize);
|
||||||
|
|
||||||
i = ff_find_unused_picture(s, direct);
|
i = ff_find_unused_picture(s->avctx, s->picture, direct);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
@ -1528,7 +1528,7 @@ no_output_pic:
|
|||||||
// one & ensure that the shared one is reuseable
|
// one & ensure that the shared one is reuseable
|
||||||
|
|
||||||
Picture *pic;
|
Picture *pic;
|
||||||
int i = ff_find_unused_picture(s, 0);
|
int i = ff_find_unused_picture(s->avctx, s->picture, 0);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return i;
|
return i;
|
||||||
pic = &s->picture[i];
|
pic = &s->picture[i];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user