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;
76  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
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 
144  {
145  .name = "default",
146  .type = AVMEDIA_TYPE_VIDEO,
147  .get_video_buffer = ff_null_get_video_buffer,
148  .filter_frame = filter_frame,
149  },
150  { NULL }
151 };
152 
154  {
155  .name = "default",
156  .type = AVMEDIA_TYPE_VIDEO
157  },
158  { NULL }
159 };
160 
162  .name = "showinfo",
163  .description = NULL_IF_CONFIG_SMALL("Show textual information for each video frame."),
164 
165  .priv_size = sizeof(ShowInfoContext),
166 
167  .inputs = avfilter_vf_showinfo_inputs,
168 
169  .outputs = avfilter_vf_showinfo_outputs,
170 };
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:50
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:1599
This structure describes decoded (raw) audio or video data.
Definition: frame.h:135
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:129
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:232
Main libavfilter public API header.
int num
numerator
Definition: rational.h:44
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:143
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: vf_showinfo.c:72
const char * name
Pad name.
Definition: internal.h:42
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:733
uint8_t
Stereo 3D type: this structure describes how two videos are packed within a single video surface...
Definition: stereo3d.h:123
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:52
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:43
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:320
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using enum...
Definition: frame.h:89
int nb_side_data
Definition: frame.h:414
AVFrameSideData ** side_data
Definition: frame.h:413
const char * name
Definition: pixdesc.h:70
A filter pad used for either input or output.
Definition: internal.h:36
int width
width and height of the video frame
Definition: frame.h:174
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:89
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:150
void * priv
private data for use by the filter
Definition: avfilter.h:584
ATSC A53 Part 4 Closed Captions.
Definition: frame.h:58
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:169
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:196
static void dump_stereo3d(AVFilterContext *ctx, AVFrameSideData *sd)
Definition: vf_showinfo.c:42
int32_t
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
Definition: stereo3d.h:114
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:186
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:134
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: frame.h:84
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:153
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
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:104
static const AVFilterPad avfilter_vf_showinfo_outputs[]
Definition: vf_showinfo.c:153
Filter definition.
Definition: avfilter.h:421
static const AVFilterPad inputs[]
Definition: af_ashowinfo.c:221
const char * name
Filter name.
Definition: avfilter.h:425
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:578
Views are on top of each other.
Definition: stereo3d.h:55
enum AVFrameSideDataType type
Definition: frame.h:103
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:141
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:325
Views are packed in a checkerboard-like structure per pixel.
Definition: stereo3d.h:76
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:191
Views are packed per column.
Definition: stereo3d.h:107
An instance of a filter.
Definition: avfilter.h:563
int height
Definition: frame.h:174
internal API functions
Stereoscopic 3d metadata.
Definition: frame.h:63
AVFilter ff_vf_showinfo
Definition: vf_showinfo.c:161