mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
libavfilter: pass QP table through the filter chain
Any volunteers to port the pp and spp filters from libmpcodec? Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
de9f5b6853
commit
c9a0f9bf3c
@ -42,6 +42,16 @@ int avfilter_copy_frame_props(AVFilterBufferRef *dst, const AVFrame *src)
|
|||||||
dst->video->top_field_first = src->top_field_first;
|
dst->video->top_field_first = src->top_field_first;
|
||||||
dst->video->key_frame = src->key_frame;
|
dst->video->key_frame = src->key_frame;
|
||||||
dst->video->pict_type = src->pict_type;
|
dst->video->pict_type = src->pict_type;
|
||||||
|
av_freep(&dst->video->qp_table);
|
||||||
|
dst->video->qp_table_linesize = 0;
|
||||||
|
if (src->qscale_table) {
|
||||||
|
int qsize = src->qstride ? src->qstride * ((src->height+15)/16) : (src->width+15)/16;
|
||||||
|
dst->video->qp_table = av_malloc(qsize);
|
||||||
|
if(!dst->video->qp_table)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
dst->video->qp_table_linesize = src->qstride;
|
||||||
|
memcpy(dst->video->qp_table, src->qscale_table, qsize);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
dst->audio->sample_rate = src->sample_rate;
|
dst->audio->sample_rate = src->sample_rate;
|
||||||
|
@ -131,6 +131,8 @@ typedef struct AVFilterBufferRefVideoProps {
|
|||||||
int top_field_first; ///< field order
|
int top_field_first; ///< field order
|
||||||
enum AVPictureType pict_type; ///< picture type of the frame
|
enum AVPictureType pict_type; ///< picture type of the frame
|
||||||
int key_frame; ///< 1 -> keyframe, 0-> not
|
int key_frame; ///< 1 -> keyframe, 0-> not
|
||||||
|
int qp_table_linesize; ///< qp_table stride
|
||||||
|
int8_t *qp_table; ///< array of Quantization Parameters
|
||||||
} AVFilterBufferRefVideoProps;
|
} AVFilterBufferRefVideoProps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,6 +52,11 @@ AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*ret->video = *ref->video;
|
*ret->video = *ref->video;
|
||||||
|
if (ref->video->qp_table) {
|
||||||
|
int qsize = ref->video->qp_table_linesize ? ref->video->qp_table_linesize * ((ref->video->h+15)/16) : (ref->video->w+15)/16;
|
||||||
|
ret->video->qp_table = av_malloc(qsize);
|
||||||
|
memcpy(ret->video->qp_table, ref->video->qp_table, qsize);
|
||||||
|
}
|
||||||
ret->extended_data = ret->data;
|
ret->extended_data = ret->data;
|
||||||
} else if (ref->type == AVMEDIA_TYPE_AUDIO) {
|
} else if (ref->type == AVMEDIA_TYPE_AUDIO) {
|
||||||
ret->audio = av_malloc(sizeof(AVFilterBufferRefAudioProps));
|
ret->audio = av_malloc(sizeof(AVFilterBufferRefAudioProps));
|
||||||
@ -95,6 +100,7 @@ void ff_free_pool(AVFilterPool *pool)
|
|||||||
av_freep(&picref->buf);
|
av_freep(&picref->buf);
|
||||||
|
|
||||||
av_freep(&picref->audio);
|
av_freep(&picref->audio);
|
||||||
|
av_assert0(!picref->video || !picref->video->qp_table);
|
||||||
av_freep(&picref->video);
|
av_freep(&picref->video);
|
||||||
av_freep(&pool->pic[i]);
|
av_freep(&pool->pic[i]);
|
||||||
pool->count--;
|
pool->count--;
|
||||||
@ -116,6 +122,9 @@ static void store_in_pool(AVFilterBufferRef *ref)
|
|||||||
av_assert0(ref->buf->data[0]);
|
av_assert0(ref->buf->data[0]);
|
||||||
av_assert0(pool->refcount>0);
|
av_assert0(pool->refcount>0);
|
||||||
|
|
||||||
|
if (ref->video)
|
||||||
|
av_freep(&ref->video->qp_table);
|
||||||
|
|
||||||
if (pool->count == POOL_SIZE) {
|
if (pool->count == POOL_SIZE) {
|
||||||
AVFilterBufferRef *ref1 = pool->pic[0];
|
AVFilterBufferRef *ref1 = pool->pic[0];
|
||||||
av_freep(&ref1->video);
|
av_freep(&ref1->video);
|
||||||
@ -155,6 +164,8 @@ void avfilter_unref_buffer(AVFilterBufferRef *ref)
|
|||||||
}
|
}
|
||||||
if (ref->extended_data != ref->data)
|
if (ref->extended_data != ref->data)
|
||||||
av_freep(&ref->extended_data);
|
av_freep(&ref->extended_data);
|
||||||
|
if (ref->video)
|
||||||
|
av_freep(&ref->video->qp_table);
|
||||||
av_freep(&ref->video);
|
av_freep(&ref->video);
|
||||||
av_freep(&ref->audio);
|
av_freep(&ref->audio);
|
||||||
av_free(ref);
|
av_free(ref);
|
||||||
@ -173,7 +184,17 @@ void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *s
|
|||||||
dst->pos = src->pos;
|
dst->pos = src->pos;
|
||||||
|
|
||||||
switch (src->type) {
|
switch (src->type) {
|
||||||
case AVMEDIA_TYPE_VIDEO: *dst->video = *src->video; break;
|
case AVMEDIA_TYPE_VIDEO: {
|
||||||
|
if (dst->video->qp_table)
|
||||||
|
av_freep(&dst->video->qp_table);
|
||||||
|
*dst->video = *src->video;
|
||||||
|
if (src->video->qp_table) {
|
||||||
|
int qsize = src->video->qp_table_linesize ? src->video->qp_table_linesize * ((src->video->h+15)/16) : (src->video->w+15)/16;
|
||||||
|
dst->video->qp_table = av_malloc(qsize);
|
||||||
|
memcpy(dst->video->qp_table, src->video->qp_table, qsize);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case AVMEDIA_TYPE_AUDIO: *dst->audio = *src->audio; break;
|
case AVMEDIA_TYPE_AUDIO: *dst->audio = *src->audio; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
#include "libavutil/avutil.h"
|
#include "libavutil/avutil.h"
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_MAJOR 3
|
#define LIBAVFILTER_VERSION_MAJOR 3
|
||||||
#define LIBAVFILTER_VERSION_MINOR 15
|
#define LIBAVFILTER_VERSION_MINOR 16
|
||||||
#define LIBAVFILTER_VERSION_MICRO 104
|
#define LIBAVFILTER_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
|
||||||
LIBAVFILTER_VERSION_MINOR, \
|
LIBAVFILTER_VERSION_MINOR, \
|
||||||
|
@ -55,6 +55,7 @@ AVFilterBufferRef *ff_default_get_video_buffer(AVFilterLink *link, int perms, in
|
|||||||
AVFilterBuffer *pic = picref->buf;
|
AVFilterBuffer *pic = picref->buf;
|
||||||
pool->pic[i] = NULL;
|
pool->pic[i] = NULL;
|
||||||
pool->count--;
|
pool->count--;
|
||||||
|
av_assert0(!picref->video->qp_table);
|
||||||
picref->video->w = w;
|
picref->video->w = w;
|
||||||
picref->video->h = h;
|
picref->video->h = h;
|
||||||
picref->perms = full_perms;
|
picref->perms = full_perms;
|
||||||
|
Loading…
Reference in New Issue
Block a user