Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2011 Stefano Sabatini
  3.  * This file is part of FFmpeg.
  4.  *
  5.  * FFmpeg is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * FFmpeg is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with FFmpeg; if not, write to the Free Software
  17.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18.  */
  19.  
  20. /**
  21.  * @file
  22.  * filter for showing textual video frame information
  23.  */
  24.  
  25. #include "libavutil/adler32.h"
  26. #include "libavutil/imgutils.h"
  27. #include "libavutil/internal.h"
  28. #include "libavutil/pixdesc.h"
  29. #include "libavutil/timestamp.h"
  30. #include "avfilter.h"
  31. #include "internal.h"
  32. #include "video.h"
  33.  
  34. static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
  35. {
  36.     AVFilterContext *ctx = inlink->dst;
  37.     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
  38.     uint32_t plane_checksum[4] = {0}, checksum = 0;
  39.     int i, plane, vsub = desc->log2_chroma_h;
  40.  
  41.     for (plane = 0; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++) {
  42.         int64_t linesize = av_image_get_linesize(frame->format, frame->width, plane);
  43.         uint8_t *data = frame->data[plane];
  44.         int h = plane == 1 || plane == 2 ? FF_CEIL_RSHIFT(inlink->h, vsub) : inlink->h;
  45.  
  46.         if (linesize < 0)
  47.             return linesize;
  48.  
  49.         for (i = 0; i < h; i++) {
  50.             plane_checksum[plane] = av_adler32_update(plane_checksum[plane], data, linesize);
  51.             checksum = av_adler32_update(checksum, data, linesize);
  52.             data += frame->linesize[plane];
  53.         }
  54.     }
  55.  
  56.     av_log(ctx, AV_LOG_INFO,
  57.            "n:%"PRId64" pts:%s pts_time:%s pos:%"PRId64" "
  58.            "fmt:%s sar:%d/%d s:%dx%d i:%c iskey:%d type:%c "
  59.            "checksum:%08X plane_checksum:[%08X",
  60.            inlink->frame_count,
  61.            av_ts2str(frame->pts), av_ts2timestr(frame->pts, &inlink->time_base), av_frame_get_pkt_pos(frame),
  62.            desc->name,
  63.            frame->sample_aspect_ratio.num, frame->sample_aspect_ratio.den,
  64.            frame->width, frame->height,
  65.            !frame->interlaced_frame ? 'P' :         /* Progressive  */
  66.            frame->top_field_first   ? 'T' : 'B',    /* Top / Bottom */
  67.            frame->key_frame,
  68.            av_get_picture_type_char(frame->pict_type),
  69.            checksum, plane_checksum[0]);
  70.  
  71.     for (plane = 1; plane < 4 && frame->data[plane] && frame->linesize[plane]; plane++)
  72.         av_log(ctx, AV_LOG_INFO, " %08X", plane_checksum[plane]);
  73.     av_log(ctx, AV_LOG_INFO, "]\n");
  74.  
  75.     return ff_filter_frame(inlink->dst->outputs[0], frame);
  76. }
  77.  
  78. static const AVFilterPad avfilter_vf_showinfo_inputs[] = {
  79.     {
  80.         .name         = "default",
  81.         .type         = AVMEDIA_TYPE_VIDEO,
  82.         .filter_frame = filter_frame,
  83.     },
  84.     { NULL }
  85. };
  86.  
  87. static const AVFilterPad avfilter_vf_showinfo_outputs[] = {
  88.     {
  89.         .name = "default",
  90.         .type = AVMEDIA_TYPE_VIDEO
  91.     },
  92.     { NULL }
  93. };
  94.  
  95. AVFilter avfilter_vf_showinfo = {
  96.     .name        = "showinfo",
  97.     .description = NULL_IF_CONFIG_SMALL("Show textual information for each video frame."),
  98.     .inputs      = avfilter_vf_showinfo_inputs,
  99.     .outputs     = avfilter_vf_showinfo_outputs,
  100. };
  101.