Libav
vf_showinfo.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011 Stefano Sabatini
3  * This file is part of Libav.
4  *
5  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
25 #include <inttypes.h>
26 
27 #include "libavutil/adler32.h"
28 #include "libavutil/display.h"
29 #include "libavutil/imgutils.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/pixdesc.h"
32 #include "libavutil/stereo3d.h"
33 
34 #include "avfilter.h"
35 #include "internal.h"
36 #include "video.h"
37 
38 typedef struct ShowInfoContext {
39  unsigned int frame;
41 
43 {
44  AVStereo3D *stereo;
45 
46  av_log(ctx, AV_LOG_INFO, "stereoscopic information: ");
47  if (sd->size < sizeof(*stereo)) {
48  av_log(ctx, AV_LOG_INFO, "invalid data");
49  return;
50  }
51 
52  stereo = (AVStereo3D *)sd->data;
53 
54  av_log(ctx, AV_LOG_INFO, "type - ");
55  switch (stereo->type) {
56  case AV_STEREO3D_2D: av_log(ctx, AV_LOG_INFO, "2D"); break;
57  case AV_STEREO3D_SIDEBYSIDE: av_log(ctx, AV_LOG_INFO, "side by side"); break;
58  case AV_STEREO3D_TOPBOTTOM: av_log(ctx, AV_LOG_INFO, "top and bottom"); break;
59  case AV_STEREO3D_FRAMESEQUENCE: av_log(ctx, AV_LOG_INFO, "frame alternate"); break;
60  case AV_STEREO3D_CHECKERBOARD: av_log(ctx, AV_LOG_INFO, "checkerboard"); break;
61  case AV_STEREO3D_LINES: av_log(ctx, AV_LOG_INFO, "interleaved lines"); break;
62  case AV_STEREO3D_COLUMNS: av_log(ctx, AV_LOG_INFO, "interleaved columns"); break;
63  case AV_STEREO3D_SIDEBYSIDE_QUINCUNX: av_log(ctx, AV_LOG_INFO, "side by side "
64  "(quincunx subsampling)"); break;
65  default: av_log(ctx, AV_LOG_WARNING, "unknown"); break;
66  }
67 
68  if (stereo->flags & AV_STEREO3D_FLAG_INVERT)
69  av_log(ctx, AV_LOG_INFO, " (inverted)");
70 }
71 
72 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
73 {
74  AVFilterContext *ctx = inlink->dst;
75  ShowInfoContext *showinfo = ctx->priv;
77  uint32_t plane_checksum[4] = {0}, checksum = 0;
78  int i, plane, vsub = desc->log2_chroma_h;
79 
80  for (plane = 0; frame->data[plane] && plane < 4; plane++) {
81  uint8_t *data = frame->data[plane];
82  int h = plane == 1 || plane == 2 ? inlink->h >> vsub : inlink->h;
83  int linesize = av_image_get_linesize(frame->format, frame->width, plane);
84  if (linesize < 0)
85  return linesize;
86 
87  for (i = 0; i < h; i++) {
88  plane_checksum[plane] = av_adler32_update(plane_checksum[plane], data, linesize);
89  checksum = av_adler32_update(checksum, data, linesize);
90  data += frame->linesize[plane];
91  }
92  }
93 
94  av_log(ctx, AV_LOG_INFO,
95  "n:%d pts:%"PRId64" pts_time:%f "
96  "fmt:%s sar:%d/%d s:%dx%d i:%c iskey:%d type:%c "
97  "checksum:%"PRIu32" plane_checksum:[%"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"]\n",
98  showinfo->frame,
99  frame->pts, frame->pts * av_q2d(inlink->time_base),
100  desc->name,
102  frame->width, frame->height,
103  !frame->interlaced_frame ? 'P' : /* Progressive */
104  frame->top_field_first ? 'T' : 'B', /* Top / Bottom */
105  frame->key_frame,
107  checksum, plane_checksum[0], plane_checksum[1], plane_checksum[2], plane_checksum[3]);
108 
109  for (i = 0; i < frame->nb_side_data; i++) {
110  AVFrameSideData *sd = frame->side_data[i];
111 
112  av_log(ctx, AV_LOG_INFO, " side data - ");
113  switch (sd->type) {
115  av_log(ctx, AV_LOG_INFO, "pan/scan");
116  break;
118  av_log(ctx, AV_LOG_INFO, "A/53 closed captions (%d bytes)", sd->size);
119  break;
121  dump_stereo3d(ctx, sd);
122  break;
124  av_log(ctx, AV_LOG_INFO, "displaymatrix: rotation of %.2f degrees",
126  break;
127  case AV_FRAME_DATA_AFD:
128  av_log(ctx, AV_LOG_INFO, "afd: value of %"PRIu8, sd->data[0]);
129  break;
130  default:
131  av_log(ctx, AV_LOG_WARNING, "unknown side data type %d (%d bytes)",
132  sd->type, sd->size);
133  break;
134  }
135 
136  av_log(ctx, AV_LOG_INFO, "\n");
137  }
138 
139  showinfo->frame++;
140  return ff_filter_frame(inlink->dst->outputs[0], frame);
141 }
142 
143 static int config_props(AVFilterContext *ctx, AVFilterLink *link, int is_out)
144 {
145 
146  av_log(ctx, AV_LOG_INFO, "config %s time_base: %d/%d, frame_rate: %d/%d\n",
147  is_out ? "out" : "in",
148  link->time_base.num, link->time_base.den,
149  link->frame_rate.num, link->frame_rate.den);
150 
151  return 0;
152 }
153 
154 static int config_props_in(AVFilterLink *link)
155 {
156  AVFilterContext *ctx = link->dst;
157  return config_props(ctx, link, 0);
158 }
159 
161 {
162  AVFilterContext *ctx = link->src;
163  return config_props(ctx, link, 1);
164 }
165 
167  {
168  .name = "default",
169  .type = AVMEDIA_TYPE_VIDEO,
170  .get_video_buffer = ff_null_get_video_buffer,
171  .filter_frame = filter_frame,
172  .config_props = config_props_in,
173  },
174  { NULL }
175 };
176 
178  {
179  .name = "default",
180  .type = AVMEDIA_TYPE_VIDEO,
181  .config_props = config_props_out,
182  },
183  { NULL }
184 };
185 
187  .name = "showinfo",
188  .description = NULL_IF_CONFIG_SMALL("Show textual information for each video frame."),
189 
190  .priv_size = sizeof(ShowInfoContext),
191 
192  .inputs = avfilter_vf_showinfo_inputs,
193 
194  .outputs = avfilter_vf_showinfo_outputs,
195 };
static int config_props_out(AVFilterLink *link)
Definition: vf_showinfo.c:160
int av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane)
Compute the size of an image line with format pix_fmt and width width for the plane plane...
Definition: imgutils.c:51
Views are packed per line, as if interlaced.
Definition: stereo3d.h:97
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:1768
This structure describes decoded (raw) audio or video data.
Definition: frame.h:140
Views are alternated temporally.
Definition: stereo3d.h:66
misc image utilities
Views are next to each other, but when upscaling apply a checkerboard pattern.
Definition: stereo3d.h:87
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:130
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:259
Main libavfilter public API header.
const char * desc
Definition: nvenc.c:101
int num
numerator
Definition: rational.h:44
av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (%s)\, len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic ? ac->func_descr_generic :ac->func_descr)
AVFrame * ff_null_get_video_buffer(AVFilterLink *link, int w, int h)
Definition: video.c:30
static const AVFilterPad avfilter_vf_showinfo_inputs[]
Definition: vf_showinfo.c:166
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: vf_showinfo.c:72
const char * name
Pad name.
Definition: internal.h:41
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:747
uint8_t
Stereo 3D type: this structure describes how two videos are packed within a single video surface...
Definition: stereo3d.h:123
static int config_props_in(AVFilterLink *link)
Definition: vf_showinfo.c:154
unsigned long av_adler32_update(unsigned long adler, const uint8_t *buf, unsigned int len)
Calculate the Adler32 checksum of a buffer.
Definition: adler32.c:42
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:211
unsigned int frame
Definition: vf_showinfo.c:39
The data is the AVPanScan struct defined in libavcodec.
Definition: frame.h:51
const char data[16]
Definition: mxf.c:70
static double av_q2d(AVRational a)
Convert rational to double.
Definition: rational.h:69
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
Definition: utils.c:50
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:263
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using enum...
Definition: frame.h:88
int nb_side_data
Definition: frame.h:329
AVFrameSideData ** side_data
Definition: frame.h:328
const char * name
Definition: pixdesc.h:81
A filter pad used for either input or output.
Definition: internal.h:35
int width
width and height of the video frame
Definition: frame.h:179
int flags
Additional information about the frame packing.
Definition: stereo3d.h:132
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:100
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:148
void * priv
private data for use by the filter
Definition: avfilter.h:277
ATSC A53 Part 4 Closed Captions.
Definition: frame.h:57
Video is not stereoscopic (and metadata has to be there).
Definition: stereo3d.h:35
common internal API header
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:201
static int config_props(AVFilterContext *ctx, AVFilterLink *link, int is_out)
Definition: vf_showinfo.c:143
static void dump_stereo3d(AVFilterContext *ctx, AVFrameSideData *sd)
Definition: vf_showinfo.c:42
int32_t
AVFormatContext * ctx
Definition: movenc.c:48
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
Definition: stereo3d.h:114
static volatile int checksum
Definition: adler32.c:27
Public header for libavutil Adler32 hasher.
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:191
NULL
Definition: eval.c:55
enum AVStereo3DType type
How views are packed within the video.
Definition: stereo3d.h:127
#define AV_LOG_INFO
Standard information.
Definition: log.h:135
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: frame.h:83
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:158
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:80
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:206
uint8_t * data
Definition: frame.h:109
static const AVFilterPad avfilter_vf_showinfo_outputs[]
Definition: vf_showinfo.c:177
Filter definition.
Definition: avfilter.h:120
static const AVFilterPad inputs[]
Definition: af_ashowinfo.c:248
const char * name
Filter name.
Definition: avfilter.h:124
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:274
Views are on top of each other.
Definition: stereo3d.h:55
enum AVFrameSideDataType type
Definition: frame.h:108
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:146
Views are next to each other.
Definition: stereo3d.h:45
int den
denominator
Definition: rational.h:45
double av_display_rotation_get(const int32_t matrix[9])
The display transformation matrix specifies an affine transformation that should be applied to video ...
Definition: display.c:34
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:268
Views are packed in a checkerboard-like structure per pixel.
Definition: stereo3d.h:76
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:196
Views are packed per column.
Definition: stereo3d.h:107
An instance of a filter.
Definition: avfilter.h:262
int height
Definition: frame.h:179
internal API functions
Stereoscopic 3d metadata.
Definition: frame.h:62
AVFilter ff_vf_showinfo
Definition: vf_showinfo.c:186