For context https://docs.google.com/document/d/1WClt3EqhjwdGXhEw386O0wfn3IBQ1Ib-_5emVM1gbnA/edit?usp=sharing Feel free to comment the doc.
On Wed, Jul 17, 2019 at 4:18 PM Juan De León <jua...@google.com> wrote: > --- > libavfilter/vf_extractqp.c | 116 ++++++++++++++++++++++++++++++++ > libavutil/Makefile | 2 + > libavutil/quantization_params.c | 28 ++++++++ > libavutil/quantization_params.h | 98 +++++++++++++++++++++++++++ > 4 files changed, 244 insertions(+) > create mode 100644 libavfilter/vf_extractqp.c > create mode 100644 libavutil/quantization_params.c > create mode 100644 libavutil/quantization_params.h > > diff --git a/libavfilter/vf_extractqp.c b/libavfilter/vf_extractqp.c > new file mode 100644 > index 0000000000..4332012cc4 > --- /dev/null > +++ b/libavfilter/vf_extractqp.c > @@ -0,0 +1,116 @@ > +/* > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > + */ > + > +#include "libavutil/frame.h" > +#include "libavutil/opt.h" > +#include "libavutil/quantization_params.h" > +#include "libavfilter/avfilter.h" > +#include "libavfilter/internal.h" > + > +typedef struct QPExtractContext { > + const AVClass *class; > + FILE *stats_file; > + char *stats_file_str; > +} QPExtractContext; > + > +#define OFFSET(x) offsetof(QPExtractContext, x) > +#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM > + > +static const AVOption qpextract_options[] = { > + {"stats_file", "Set file to store QP information", > OFFSET(stats_file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }, > + {"f", "Set file to store QP information", > OFFSET(stats_file_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS }, > + { NULL } > +}; > + > +AVFILTER_DEFINE_CLASS(qpextract); > + > +static av_cold int init(AVFilterContext *ctx) > +{ > + QPExtractContext *s = ctx->priv; > + > + if (s->stats_file_str) { > + if (!strcmp(s->stats_file_str, "-")) { > + s->stats_file = stdout; > + } else { > + s->stats_file = fopen(s->stats_file_str, "w"); > + if (!s->stats_file) { > + int err = AVERROR(errno); > + char buf[128]; > + av_strerror(err, buf, sizeof(buf)); > + av_log(ctx, AV_LOG_ERROR, "Could not open log file %s: > %s\n", > + s->stats_file_str, buf); > + return err; > + } > + } > + } > + return 0; > +} > + > +static av_cold int uninit(AVFilterContext *ctx) { > + return 0; > +} > + > +static int filter_frame(AVFilterLink *inlink, AVFrame *in) { > + AVFilterContext *ctx = inlink->dst; > + AVFilterLink *outlink = ctx->outputs[0]; > + QPExtractContext *s = ctx->priv; > + AVFrame *out = NULL; > + > + if (ctx->is_disabled) { > + return ff_filter_frame(outlink, in); > + } > + > + AVFrameSideData *sd = av_frame_get_side_data(in, > AV_FRAME_DATA_QUANTIZATION_PARAMS); > + > + if (!sd) { > + fprintf(s->stats_file, "no side data"); > + } > + else { > + fprintf(s->stats_file, "yes side data"); > + } > + > + return ff_filter_frame(outlink, in); > +} > + > +static const AVFilterPad qpextract_inputs[] = { > + { > + .name = "default", > + .type = AVMEDIA_TYPE_VIDEO, > + .filter_frame = filter_frame, > + }, > + { NULL } > +}; > + > +static const AVFilterPad qpextract_outputs[] = { > + { > + .name = "default", > + .type = AVMEDIA_TYPE_VIDEO, > + }, > + { NULL } > +}; > + > +AVFilter ff_vf_qpextract = { > + .name = "extractqp", > + .description = NULL_IF_CONFIG_SMALL("Extract quantization > parameters."), > + .init = init, > + .uninit = uninit, > + .priv_size = sizeof(QPExtractContext), > + .priv_class = &qpextract_class, > + .inputs = qpextract_inputs, > + .outputs = qpextract_outputs, > +}; > diff --git a/libavutil/Makefile b/libavutil/Makefile > index 8a7a44e4b5..be1a9c3a9c 100644 > --- a/libavutil/Makefile > +++ b/libavutil/Makefile > @@ -60,6 +60,7 @@ HEADERS = adler32.h > \ > pixdesc.h \ > pixelutils.h \ > pixfmt.h \ > + quantization_params.h \ > random_seed.h \ > rc4.h \ > rational.h \ > @@ -140,6 +141,7 @@ OBJS = adler32.o > \ > parseutils.o \ > pixdesc.o \ > pixelutils.o \ > + quantization_params.o \ > random_seed.o \ > rational.o \ > reverse.o \ > diff --git a/libavutil/quantization_params.c > b/libavutil/quantization_params.c > new file mode 100644 > index 0000000000..96ffd78dbb > --- /dev/null > +++ b/libavutil/quantization_params.c > @@ -0,0 +1,28 @@ > +/* > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > + */ > + > +#include "libavutil/quantization_params.h" > + > +/** > + * Strings for names of enums, used by Filter > + */ > +const char* const QP_NAMES_H264[] = {"qp"}; > +const char* const QP_NAMES_VP9[] = {"qydc", "qyac", "quvdc", "quvac", > "qiydc", "qiyac", > + "qiuvdc", "qiuvac"}; > +const char* const QP_NAMES_AV1[] = {"qydc", "qyac", "qudc", "quac", > "qvdc", "qvac", > + "qiydc", "qiyac", "qiudc", "qiuac", > "qivdc", "qivac"}; > \ No newline at end of file > diff --git a/libavutil/quantization_params.h > b/libavutil/quantization_params.h > new file mode 100644 > index 0000000000..e986abe842 > --- /dev/null > +++ b/libavutil/quantization_params.h > @@ -0,0 +1,98 @@ > +/* > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > + */ > + > +#ifndef AVUTIL_QUANTIZATION_PARAMS_H > +#define AVUTIL_QUANTIZATION_PARAMS_H > + > +/** > + * Data structure for extracting Quantization Parameters codec independent > + */ > +typedef struct AVQuantizationParams { > + /** > + * x and y coordinates of the block in pixels > + */ > + int x, y; > + /** > + * width and height of the block in pixels > + */ > + int w, h; > + /** > + * qp array, indexed by type according to > + * the enum corresponding to the codec > + * size depends on codec > + */ > + int *type; > +} AVQuantizationParams; > + > +/** > + * For storing an array of AVQuantization parameters and its size > + * To be used as AVFrameSideData > + */ > +typedef struct AVQuantizationParamsArray { > + /** > + * AVQuantizationParams block array > + */ > + AVQuantizationParams *qp_arr; > + /** > + * size of the array > + */ > + int nb_blocks; > +} AVQuantizationParamsArray; > + > +/** > + * Enums for different codecs to store qp in the type array > + * Each enum must have an array of strings describing each field > + * used for output > + */ > +extern const char* const QP_ENUM_NAMES_H264[]; > +enum QP_ARR_INDEXES_FOR_H264 { > + QP_H264 = 0, // qp value > + QP_TYPE_ARR_SIZE_H264 // used for allocating memory > +}; > + > +extern const char* const QP_NAMES_VP9[]; > +enum QP_ARR_INDEXES_FOR_VP9 { > + QP_YDC_VP9 = 0, > + QP_YAC_VP9, > + QP_UVDC_VP9, > + QP_UVAC_VP9, > + QP_INDEX_YDC_VP9, > + QP_INDEX_YAC_VP9, > + QP_INDEX_UVDC_VP9, > + QP_INDEX_UVAC_VP9, > + QP_ARR_SIZE_VP9 > +}; > + > +extern const char* const QP_NAMES_AV1[]; > +enum QP_ARR_INDEXES_FOR_AV1 { > + QP_YDC_AV1 = 0, > + QP_YAC_AV1, > + QP_UDC_AV1, > + QP_UAC_AV1, > + QP_VDC_AV1, > + QP_VAC_AV1, > + QP_INDEX_YDC_AV1, > + QP_INDEX_YAC_AV1, > + QP_INDEX_UDC_AV1, > + QP_INDEX_UAC_AV1, > + QP_INDEX_VDC_AV1, > + QP_INDEX_VAC_AV1, > + QP_ARR_SIZE_AV1 > +}; > + > +#endif /* AVUTIL_QUANTIZATION_PARAMS_H */ > -- > 2.22.0.510.g264f2c817a-goog > > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".