/*
- * This file is part of FFmpeg.
- * copyright (C) 2009 Stefano Sabatini
+ * Copyright (c) 2009 Stefano Sabatini
*
- * FFmpeg is free software; you can redistribute it and/or
+ * This file is part of Libav.
+ *
+ * Libav 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,
+ * Libav 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
+ * License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
* pixdesc test filter
*/
+#include "libavutil/common.h"
#include "libavutil/pixdesc.h"
#include "avfilter.h"
+#include "internal.h"
+#include "video.h"
-typedef struct {
+typedef struct PixdescTestContext {
const AVPixFmtDescriptor *pix_desc;
uint16_t *line;
} PixdescTestContext;
{
PixdescTestContext *priv = inlink->dst->priv;
- priv->pix_desc = &av_pix_fmt_descriptors[inlink->format];
+ priv->pix_desc = av_pix_fmt_desc_get(inlink->format);
+ av_freep(&priv->line);
if (!(priv->line = av_malloc(sizeof(*priv->line) * inlink->w)))
return AVERROR(ENOMEM);
return 0;
}
-static void start_frame(AVFilterLink *inlink, AVFilterPicRef *picref)
+static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
PixdescTestContext *priv = inlink->dst->priv;
AVFilterLink *outlink = inlink->dst->outputs[0];
- AVFilterPicRef *outpicref;
- int i;
+ AVFrame *out;
+ int i, c, w = inlink->w, h = inlink->h;
+
+ out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+ if (!out) {
+ av_frame_free(&in);
+ return AVERROR(ENOMEM);
+ }
- outlink->outpic = avfilter_get_video_buffer(outlink, AV_PERM_WRITE,
- outlink->w, outlink->h);
- outpicref = outlink->outpic;
- avfilter_copy_picref_props(outpicref, picref);
+ av_frame_copy_props(out, in);
for (i = 0; i < 4; i++) {
int h = outlink->h;
h = i == 1 || i == 2 ? h>>priv->pix_desc->log2_chroma_h : h;
- if (outpicref->data[i]) {
- uint8_t *data = outpicref->data[i] +
- (outpicref->linesize[i] > 0 ? 0 : outpicref->linesize[i] * (h-1));
- memset(data, 0, FFABS(outpicref->linesize[i]) * h);
+ if (out->data[i]) {
+ uint8_t *data = out->data[i] +
+ (out->linesize[i] > 0 ? 0 : out->linesize[i] * (h-1));
+ memset(data, 0, FFABS(out->linesize[i]) * h);
}
}
/* copy palette */
- if (priv->pix_desc->flags & PIX_FMT_PAL)
- memcpy(outpicref->data[1], outpicref->data[1], 256*4);
-
- avfilter_start_frame(outlink, avfilter_ref_pic(outpicref, ~0));
-}
-
-static void draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
-{
- PixdescTestContext *priv = inlink->dst->priv;
- AVFilterPicRef *inpic = inlink->cur_pic;
- AVFilterPicRef *outpic = inlink->dst->outputs[0]->outpic;
- int i, c, w = inlink->w;
+ if (priv->pix_desc->flags & AV_PIX_FMT_FLAG_PAL ||
+ priv->pix_desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL)
+ memcpy(out->data[1], in->data[1], 256*4);
for (c = 0; c < priv->pix_desc->nb_components; c++) {
int w1 = c == 1 || c == 2 ? w>>priv->pix_desc->log2_chroma_w : w;
int h1 = c == 1 || c == 2 ? h>>priv->pix_desc->log2_chroma_h : h;
- int y1 = c == 1 || c == 2 ? y>>priv->pix_desc->log2_chroma_h : y;
- for (i = y1; i < y1 + h1; i++) {
+ for (i = 0; i < h1; i++) {
av_read_image_line(priv->line,
- inpic->data,
- inpic->linesize,
- priv->pix_desc,
- 0, i, c, w1, 0);
+ in->data,
+ in->linesize,
+ priv->pix_desc,
+ 0, i, c, w1, 0);
av_write_image_line(priv->line,
- outpic->data,
- outpic->linesize,
- priv->pix_desc,
- 0, i, c, w1);
+ out->data,
+ out->linesize,
+ priv->pix_desc,
+ 0, i, c, w1);
}
}
- avfilter_draw_slice(inlink->dst->outputs[0], y, h, slice_dir);
+ av_frame_free(&in);
+ return ff_filter_frame(outlink, out);
}
-AVFilter avfilter_vf_pixdesctest = {
+static const AVFilterPad avfilter_vf_pixdesctest_inputs[] = {
+ {
+ .name = "default",
+ .type = AVMEDIA_TYPE_VIDEO,
+ .filter_frame = filter_frame,
+ .config_props = config_props,
+ },
+ { NULL }
+};
+
+static const AVFilterPad avfilter_vf_pixdesctest_outputs[] = {
+ {
+ .name = "default",
+ .type = AVMEDIA_TYPE_VIDEO,
+ },
+ { NULL }
+};
+
+AVFilter ff_vf_pixdesctest = {
.name = "pixdesctest",
- .description = "Test pixel format definitions.",
+ .description = NULL_IF_CONFIG_SMALL("Test pixel format definitions."),
.priv_size = sizeof(PixdescTestContext),
.uninit = uninit,
- .inputs = (AVFilterPad[]) {{ .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .start_frame = start_frame,
- .draw_slice = draw_slice,
- .config_props = config_props,
- .min_perms = AV_PERM_READ, },
- { .name = NULL}},
-
- .outputs = (AVFilterPad[]) {{ .name = "default",
- .type = AVMEDIA_TYPE_VIDEO, },
- { .name = NULL}},
+ .inputs = avfilter_vf_pixdesctest_inputs,
+
+ .outputs = avfilter_vf_pixdesctest_outputs,
};