Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2007 Bobby Bingham
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. /**
  22.  * @file
  23.  * format and noformat video filters
  24.  */
  25.  
  26. #include <string.h>
  27.  
  28. #include "libavutil/internal.h"
  29. #include "libavutil/mem.h"
  30. #include "libavutil/pixdesc.h"
  31. #include "libavutil/opt.h"
  32.  
  33. #include "avfilter.h"
  34. #include "formats.h"
  35. #include "internal.h"
  36. #include "video.h"
  37.  
  38. typedef struct {
  39.     const AVClass *class;
  40.     char *pix_fmts;
  41.     /**
  42.      * List of flags telling if a given image format has been listed
  43.      * as argument to the filter.
  44.      */
  45.     int listed_pix_fmt_flags[AV_PIX_FMT_NB];
  46. } FormatContext;
  47.  
  48. #define AV_PIX_FMT_NAME_MAXSIZE 32
  49.  
  50. static av_cold int init(AVFilterContext *ctx)
  51. {
  52.     FormatContext *s = ctx->priv;
  53.     const char *cur, *sep;
  54.     char             pix_fmt_name[AV_PIX_FMT_NAME_MAXSIZE];
  55.     int              pix_fmt_name_len, ret;
  56.     enum AVPixelFormat pix_fmt;
  57.  
  58.     /* parse the list of formats */
  59.     for (cur = s->pix_fmts; cur; cur = sep ? sep + 1 : NULL) {
  60.         if (!(sep = strchr(cur, '|')))
  61.             pix_fmt_name_len = strlen(cur);
  62.         else
  63.             pix_fmt_name_len = sep - cur;
  64.         if (pix_fmt_name_len >= AV_PIX_FMT_NAME_MAXSIZE) {
  65.             av_log(ctx, AV_LOG_ERROR, "Format name too long\n");
  66.             return -1;
  67.         }
  68.  
  69.         memcpy(pix_fmt_name, cur, pix_fmt_name_len);
  70.         pix_fmt_name[pix_fmt_name_len] = 0;
  71.  
  72.         if ((ret = ff_parse_pixel_format(&pix_fmt, pix_fmt_name, ctx)) < 0)
  73.             return ret;
  74.  
  75.         s->listed_pix_fmt_flags[pix_fmt] = 1;
  76.     }
  77.  
  78.     return 0;
  79. }
  80.  
  81. static AVFilterFormats *make_format_list(FormatContext *s, int flag)
  82. {
  83.     AVFilterFormats *formats = NULL;
  84.     enum AVPixelFormat pix_fmt;
  85.  
  86.     for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
  87.         if (s->listed_pix_fmt_flags[pix_fmt] == flag) {
  88.             int ret = ff_add_format(&formats, pix_fmt);
  89.             if (ret < 0) {
  90.                 ff_formats_unref(&formats);
  91.                 return NULL;
  92.             }
  93.         }
  94.  
  95.     return formats;
  96. }
  97.  
  98. #define OFFSET(x) offsetof(FormatContext, x)
  99. static const AVOption options[] = {
  100.     { "pix_fmts", "A '|'-separated list of pixel formats", OFFSET(pix_fmts), AV_OPT_TYPE_STRING, .flags = AV_OPT_FLAG_VIDEO_PARAM },
  101.     { NULL }
  102. };
  103.  
  104. #if CONFIG_FORMAT_FILTER
  105. static int query_formats_format(AVFilterContext *ctx)
  106. {
  107.     ff_set_common_formats(ctx, make_format_list(ctx->priv, 1));
  108.     return 0;
  109. }
  110.  
  111. #define format_options options
  112. AVFILTER_DEFINE_CLASS(format);
  113.  
  114. static const AVFilterPad avfilter_vf_format_inputs[] = {
  115.     {
  116.         .name             = "default",
  117.         .type             = AVMEDIA_TYPE_VIDEO,
  118.         .get_video_buffer = ff_null_get_video_buffer,
  119.     },
  120.     { NULL }
  121. };
  122.  
  123. static const AVFilterPad avfilter_vf_format_outputs[] = {
  124.     {
  125.         .name = "default",
  126.         .type = AVMEDIA_TYPE_VIDEO
  127.     },
  128.     { NULL }
  129. };
  130.  
  131. AVFilter avfilter_vf_format = {
  132.     .name          = "format",
  133.     .description   = NULL_IF_CONFIG_SMALL("Convert the input video to one of the specified pixel formats."),
  134.     .init          = init,
  135.     .query_formats = query_formats_format,
  136.     .priv_size     = sizeof(FormatContext),
  137.     .priv_class    = &format_class,
  138.     .inputs        = avfilter_vf_format_inputs,
  139.     .outputs       = avfilter_vf_format_outputs,
  140. };
  141. #endif /* CONFIG_FORMAT_FILTER */
  142.  
  143. #if CONFIG_NOFORMAT_FILTER
  144. static int query_formats_noformat(AVFilterContext *ctx)
  145. {
  146.     ff_set_common_formats(ctx, make_format_list(ctx->priv, 0));
  147.     return 0;
  148. }
  149.  
  150. #define noformat_options options
  151. AVFILTER_DEFINE_CLASS(noformat);
  152.  
  153. static const AVFilterPad avfilter_vf_noformat_inputs[] = {
  154.     {
  155.         .name             = "default",
  156.         .type             = AVMEDIA_TYPE_VIDEO,
  157.         .get_video_buffer = ff_null_get_video_buffer,
  158.     },
  159.     { NULL }
  160. };
  161.  
  162. static const AVFilterPad avfilter_vf_noformat_outputs[] = {
  163.     {
  164.         .name = "default",
  165.         .type = AVMEDIA_TYPE_VIDEO
  166.     },
  167.     { NULL }
  168. };
  169.  
  170. AVFilter avfilter_vf_noformat = {
  171.     .name          = "noformat",
  172.     .description   = NULL_IF_CONFIG_SMALL("Force libavfilter not to use any of the specified pixel formats for the input to the next filter."),
  173.     .init          = init,
  174.     .query_formats = query_formats_noformat,
  175.     .priv_size     = sizeof(FormatContext),
  176.     .priv_class    = &noformat_class,
  177.     .inputs        = avfilter_vf_noformat_inputs,
  178.     .outputs       = avfilter_vf_noformat_outputs,
  179. };
  180. #endif /* CONFIG_NOFORMAT_FILTER */
  181.