FFmpeg
vf_transpose_npp.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <nppi.h>
20 #include <stdio.h>
21 #include <string.h>
22 
23 #include "libavutil/common.h"
24 #include "libavutil/hwcontext.h"
26 #include "libavutil/cuda_check.h"
27 #include "libavutil/internal.h"
28 #include "libavutil/opt.h"
29 #include "libavutil/pixdesc.h"
30 
31 #include "avfilter.h"
32 #include "formats.h"
33 #include "internal.h"
34 #include "video.h"
35 
36 #define CHECK_CU(x) FF_CUDA_CHECK_DL(ctx, device_hwctx->internal->cuda_dl, x)
37 
38 static const enum AVPixelFormat supported_formats[] = {
41 };
42 
47 };
48 
49 enum Transpose {
54 };
55 
60 };
61 
62 typedef struct NPPTransposeStageContext {
66  struct {
67  int width;
68  int height;
69  } planes_in[3], planes_out[3];
73 
74 typedef struct NPPTransposeContext {
75  const AVClass *class;
78 
79  int passthrough; ///< PassthroughType, landscape passthrough mode enabled
80  int dir; ///< TransposeDir
82 
84 {
85  NPPTransposeContext *s = ctx->priv;
86  int i;
87 
88  for (i = 0; i < FF_ARRAY_ELEMS(s->stages); i++) {
89  s->stages[i].frame = av_frame_alloc();
90  if (!s->stages[i].frame)
91  return AVERROR(ENOMEM);
92  }
93 
94  s->tmp_frame = av_frame_alloc();
95  if (!s->tmp_frame)
96  return AVERROR(ENOMEM);
97 
98  return 0;
99 }
100 
102 {
103  NPPTransposeContext *s = ctx->priv;
104  int i;
105 
106  for (i = 0; i < FF_ARRAY_ELEMS(s->stages); i++) {
107  av_frame_free(&s->stages[i].frame);
108  av_buffer_unref(&s->stages[i].frames_ctx);
109  }
110 
111  av_frame_free(&s->tmp_frame);
112 }
113 
114 static int init_stage(NPPTransposeStageContext *stage, AVBufferRef *device_ctx)
115 {
116  AVBufferRef *out_ref = NULL;
117  AVHWFramesContext *out_ctx;
118  int in_sw, in_sh, out_sw, out_sh;
119  int ret, i;
120 
121  av_pix_fmt_get_chroma_sub_sample(stage->in_fmt, &in_sw, &in_sh);
122  av_pix_fmt_get_chroma_sub_sample(stage->out_fmt, &out_sw, &out_sh);
123 
124  if (!stage->planes_out[0].width) {
125  stage->planes_out[0].width = stage->planes_in[0].width;
126  stage->planes_out[0].height = stage->planes_in[0].height;
127  }
128 
129  for (i = 1; i < FF_ARRAY_ELEMS(stage->planes_in); i++) {
130  stage->planes_in[i].width = stage->planes_in[0].width >> in_sw;
131  stage->planes_in[i].height = stage->planes_in[0].height >> in_sh;
132  stage->planes_out[i].width = stage->planes_out[0].width >> out_sw;
133  stage->planes_out[i].height = stage->planes_out[0].height >> out_sh;
134  }
135 
136  out_ref = av_hwframe_ctx_alloc(device_ctx);
137  if (!out_ref)
138  return AVERROR(ENOMEM);
139  out_ctx = (AVHWFramesContext*)out_ref->data;
140 
141  out_ctx->format = AV_PIX_FMT_CUDA;
142  out_ctx->sw_format = stage->out_fmt;
143  out_ctx->width = FFALIGN(stage->planes_out[0].width, 32);
144  out_ctx->height = FFALIGN(stage->planes_out[0].height, 32);
145 
146  ret = av_hwframe_ctx_init(out_ref);
147  if (ret < 0)
148  goto fail;
149 
150  av_frame_unref(stage->frame);
151  ret = av_hwframe_get_buffer(out_ref, stage->frame, 0);
152  if (ret < 0)
153  goto fail;
154 
155  stage->frame->width = stage->planes_out[0].width;
156  stage->frame->height = stage->planes_out[0].height;
157  av_buffer_unref(&stage->frames_ctx);
158  stage->frames_ctx = out_ref;
159 
160  return 0;
161 
162 fail:
163  av_buffer_unref(&out_ref);
164  return ret;
165 }
166 
167 static int format_is_supported(enum AVPixelFormat fmt)
168 {
169  int i;
170 
171  for (i = 0; i < FF_ARRAY_ELEMS(supported_formats); i++)
172  if (supported_formats[i] == fmt)
173  return 1;
174 
175  return 0;
176 }
177 
178 static int init_processing_chain(AVFilterContext *ctx, int in_width, int in_height,
179  int out_width, int out_height)
180 {
181  NPPTransposeContext *s = ctx->priv;
182  AVHWFramesContext *in_frames_ctx;
183  enum AVPixelFormat format;
184  int i, ret, last_stage = -1;
185  int rot_width = out_width, rot_height = out_height;
186 
187  /* check that we have a hw context */
188  if (!ctx->inputs[0]->hw_frames_ctx) {
189  av_log(ctx, AV_LOG_ERROR, "No hw context provided on input\n");
190  return AVERROR(EINVAL);
191  }
192 
193  in_frames_ctx = (AVHWFramesContext*)ctx->inputs[0]->hw_frames_ctx->data;
194  format = in_frames_ctx->sw_format;
195 
197  av_log(ctx, AV_LOG_ERROR, "Unsupported input format: %s\n",
199  return AVERROR(ENOSYS);
200  }
201 
202  if (s->dir != NPP_TRANSPOSE_CCLOCK_FLIP) {
203  s->stages[STAGE_ROTATE].stage_needed = 1;
204  }
205 
206  if (s->dir == NPP_TRANSPOSE_CCLOCK_FLIP || s->dir == NPP_TRANSPOSE_CLOCK_FLIP) {
207  s->stages[STAGE_TRANSPOSE].stage_needed = 1;
208 
209  /* Rotating by 180° in case of clock_flip, or not at all for cclock_flip, so width/height unchanged by rotation */
210  rot_width = in_width;
211  rot_height = in_height;
212  }
213 
214  s->stages[STAGE_ROTATE].in_fmt = format;
215  s->stages[STAGE_ROTATE].out_fmt = format;
216  s->stages[STAGE_ROTATE].planes_in[0].width = in_width;
217  s->stages[STAGE_ROTATE].planes_in[0].height = in_height;
218  s->stages[STAGE_ROTATE].planes_out[0].width = rot_width;
219  s->stages[STAGE_ROTATE].planes_out[0].height = rot_height;
220  s->stages[STAGE_TRANSPOSE].in_fmt = format;
221  s->stages[STAGE_TRANSPOSE].out_fmt = format;
222  s->stages[STAGE_TRANSPOSE].planes_in[0].width = rot_width;
223  s->stages[STAGE_TRANSPOSE].planes_in[0].height = rot_height;
224  s->stages[STAGE_TRANSPOSE].planes_out[0].width = out_width;
225  s->stages[STAGE_TRANSPOSE].planes_out[0].height = out_height;
226 
227  /* init the hardware contexts */
228  for (i = 0; i < FF_ARRAY_ELEMS(s->stages); i++) {
229  if (!s->stages[i].stage_needed)
230  continue;
231  ret = init_stage(&s->stages[i], in_frames_ctx->device_ref);
232  if (ret < 0)
233  return ret;
234  last_stage = i;
235  }
236 
237  if (last_stage >= 0) {
238  ctx->outputs[0]->hw_frames_ctx = av_buffer_ref(s->stages[last_stage].frames_ctx);
239  } else {
240  ctx->outputs[0]->hw_frames_ctx = av_buffer_ref(ctx->inputs[0]->hw_frames_ctx);
241  s->passthrough = 1;
242  }
243 
244  if (!ctx->outputs[0]->hw_frames_ctx)
245  return AVERROR(ENOMEM);
246 
247  return 0;
248 }
249 
251 {
252  AVFilterContext *ctx = outlink->src;
253  AVFilterLink *inlink = ctx->inputs[0];
254  NPPTransposeContext *s = ctx->priv;
255  int ret;
256 
257  if ((inlink->w >= inlink->h && s->passthrough == NPP_TRANSPOSE_PT_TYPE_LANDSCAPE) ||
258  (inlink->w <= inlink->h && s->passthrough == NPP_TRANSPOSE_PT_TYPE_PORTRAIT))
259  {
260  if (inlink->hw_frames_ctx) {
261  outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
262  if (!outlink->hw_frames_ctx)
263  return AVERROR(ENOMEM);
264  }
265 
267  "w:%d h:%d -> w:%d h:%d (passthrough mode)\n",
268  inlink->w, inlink->h, inlink->w, inlink->h);
269  return 0;
270  } else {
271  s->passthrough = NPP_TRANSPOSE_PT_TYPE_NONE;
272  }
273 
274  outlink->w = inlink->h;
275  outlink->h = inlink->w;
276  outlink->sample_aspect_ratio = (AVRational){inlink->sample_aspect_ratio.den, inlink->sample_aspect_ratio.num};
277 
278  ret = init_processing_chain(ctx, inlink->w, inlink->h, outlink->w, outlink->h);
279  if (ret < 0)
280  return ret;
281 
282  av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d -transpose-> w:%d h:%d\n",
283  inlink->w, inlink->h, outlink->w, outlink->h);
284 
285  return 0;
286 }
287 
289  AVFrame *out, AVFrame *in)
290 {
291  NPPTransposeContext *s = ctx->priv;
292  NppStatus err;
293  int i;
294 
295  for (i = 0; i < FF_ARRAY_ELEMS(stage->planes_in) && i < FF_ARRAY_ELEMS(in->data) && in->data[i]; i++) {
296  int iw = stage->planes_in[i].width;
297  int ih = stage->planes_in[i].height;
298  int ow = stage->planes_out[i].width;
299  int oh = stage->planes_out[i].height;
300 
301  // nppRotate uses 0,0 as the rotation point
302  // need to shift the image accordingly after rotation
303  // need to subtract 1 to get the correct coordinates
304  double angle = s->dir == NPP_TRANSPOSE_CLOCK ? -90.0 : s->dir == NPP_TRANSPOSE_CCLOCK ? 90.0 : 180.0;
305  int shiftw = (s->dir == NPP_TRANSPOSE_CLOCK || s->dir == NPP_TRANSPOSE_CLOCK_FLIP) ? ow - 1 : 0;
306  int shifth = (s->dir == NPP_TRANSPOSE_CCLOCK || s->dir == NPP_TRANSPOSE_CLOCK_FLIP) ? oh - 1 : 0;
307 
308  err = nppiRotate_8u_C1R(in->data[i], (NppiSize){ iw, ih },
309  in->linesize[i], (NppiRect){ 0, 0, iw, ih },
310  out->data[i], out->linesize[i],
311  (NppiRect){ 0, 0, ow, oh },
312  angle, shiftw, shifth, NPPI_INTER_NN);
313  if (err != NPP_SUCCESS) {
314  av_log(ctx, AV_LOG_ERROR, "NPP rotate error: %d\n", err);
315  return AVERROR_UNKNOWN;
316  }
317  }
318 
319  return 0;
320 }
321 
323  AVFrame *out, AVFrame *in)
324 {
325  NppStatus err;
326  int i;
327 
328  for (i = 0; i < FF_ARRAY_ELEMS(stage->planes_in) && i < FF_ARRAY_ELEMS(in->data) && in->data[i]; i++) {
329  int iw = stage->planes_in[i].width;
330  int ih = stage->planes_in[i].height;
331 
332  err = nppiTranspose_8u_C1R(in->data[i], in->linesize[i],
333  out->data[i], out->linesize[i],
334  (NppiSize){ iw, ih });
335  if (err != NPP_SUCCESS) {
336  av_log(ctx, AV_LOG_ERROR, "NPP transpose error: %d\n", err);
337  return AVERROR_UNKNOWN;
338  }
339  }
340 
341  return 0;
342 }
343 
345  AVFrame *out, AVFrame *in) = {
348 };
349 
351 {
352  NPPTransposeContext *s = ctx->priv;
353  AVFrame *src = in;
354  int i, ret, last_stage = -1;
355 
356  for (i = 0; i < FF_ARRAY_ELEMS(s->stages); i++) {
357  if (!s->stages[i].stage_needed)
358  continue;
359 
360  ret = npptranspose_process[i](ctx, &s->stages[i], s->stages[i].frame, src);
361  if (ret < 0)
362  return ret;
363 
364  src = s->stages[i].frame;
365  last_stage = i;
366  }
367 
368  if (last_stage < 0)
369  return AVERROR_BUG;
370 
371  ret = av_hwframe_get_buffer(src->hw_frames_ctx, s->tmp_frame, 0);
372  if (ret < 0)
373  return ret;
374 
376  av_frame_move_ref(src, s->tmp_frame);
377 
378  ret = av_frame_copy_props(out, in);
379  if (ret < 0)
380  return ret;
381 
382  return 0;
383 }
384 
386 {
387  AVFilterContext *ctx = link->dst;
388  NPPTransposeContext *s = ctx->priv;
389  AVFilterLink *outlink = ctx->outputs[0];
390  AVHWFramesContext *frames_ctx = (AVHWFramesContext*)outlink->hw_frames_ctx->data;
391  AVCUDADeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
392  AVFrame *out = NULL;
393  CUcontext dummy;
394  int ret = 0;
395 
396  if (s->passthrough)
397  return ff_filter_frame(outlink, in);
398 
399  out = av_frame_alloc();
400  if (!out) {
401  ret = AVERROR(ENOMEM);
402  goto fail;
403  }
404 
405  ret = CHECK_CU(device_hwctx->internal->cuda_dl->cuCtxPushCurrent(device_hwctx->cuda_ctx));
406  if (ret < 0)
407  goto fail;
408 
409  ret = npptranspose_filter(ctx, out, in);
410 
411  CHECK_CU(device_hwctx->internal->cuda_dl->cuCtxPopCurrent(&dummy));
412  if (ret < 0)
413  goto fail;
414 
415  av_frame_free(&in);
416 
417  return ff_filter_frame(outlink, out);
418 
419 fail:
420  av_frame_free(&in);
421  av_frame_free(&out);
422  return ret;
423 }
424 
425 #define OFFSET(x) offsetof(NPPTransposeContext, x)
426 #define FLAGS (AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM)
427 
428 static const AVOption options[] = {
429  { "dir", "set transpose direction", OFFSET(dir), AV_OPT_TYPE_INT, { .i64 = NPP_TRANSPOSE_CCLOCK_FLIP }, 0, 3, FLAGS, .unit = "dir" },
430  { "cclock_flip", "rotate counter-clockwise with vertical flip", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_CCLOCK_FLIP }, 0, 0, FLAGS, .unit = "dir" },
431  { "clock", "rotate clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_CLOCK }, 0, 0, FLAGS, .unit = "dir" },
432  { "cclock", "rotate counter-clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_CCLOCK }, 0, 0, FLAGS, .unit = "dir" },
433  { "clock_flip", "rotate clockwise with vertical flip", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_CLOCK_FLIP }, 0, 0, FLAGS, .unit = "dir" },
434  { "passthrough", "do not apply transposition if the input matches the specified geometry", OFFSET(passthrough), AV_OPT_TYPE_INT, { .i64 = NPP_TRANSPOSE_PT_TYPE_NONE }, 0, 2, FLAGS, .unit = "passthrough" },
435  { "none", "always apply transposition", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_PT_TYPE_NONE }, 0, 0, FLAGS, .unit = "passthrough" },
436  { "landscape", "preserve landscape geometry", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_PT_TYPE_LANDSCAPE }, 0, 0, FLAGS, .unit = "passthrough" },
437  { "portrait", "preserve portrait geometry", 0, AV_OPT_TYPE_CONST, { .i64 = NPP_TRANSPOSE_PT_TYPE_PORTRAIT }, 0, 0, FLAGS, .unit = "passthrough" },
438  { NULL },
439 };
440 
441 static const AVClass npptranspose_class = {
442  .class_name = "npptranspose",
443  .item_name = av_default_item_name,
444  .option = options,
445  .version = LIBAVUTIL_VERSION_INT,
446 };
447 
449  {
450  .name = "default",
451  .type = AVMEDIA_TYPE_VIDEO,
452  .filter_frame = npptranspose_filter_frame,
453  },
454 };
455 
457  {
458  .name = "default",
459  .type = AVMEDIA_TYPE_VIDEO,
460  .config_props = npptranspose_config_props,
461  },
462 };
463 
465  .name = "transpose_npp",
466  .description = NULL_IF_CONFIG_SMALL("NVIDIA Performance Primitives video transpose"),
467  .init = npptranspose_init,
468  .uninit = npptranspose_uninit,
469  .priv_size = sizeof(NPPTransposeContext),
470  .priv_class = &npptranspose_class,
474  .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
475 };
AVHWDeviceContext::hwctx
void * hwctx
The format-specific data, allocated and freed by libavutil along with this context.
Definition: hwcontext.h:85
AV_PIX_FMT_CUDA
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition: pixfmt.h:260
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
init_processing_chain
static int init_processing_chain(AVFilterContext *ctx, int in_width, int in_height, int out_width, int out_height)
Definition: vf_transpose_npp.c:178
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
npptranspose_filter
static int npptranspose_filter(AVFilterContext *ctx, AVFrame *out, AVFrame *in)
Definition: vf_transpose_npp.c:350
hwcontext_cuda_internal.h
npptranspose_init
static int npptranspose_init(AVFilterContext *ctx)
Definition: vf_transpose_npp.c:83
out
FILE * out
Definition: movenc.c:54
FF_FILTER_FLAG_HWFRAME_AWARE
#define FF_FILTER_FLAG_HWFRAME_AWARE
The filter is aware of hardware frames, and any hardware frame context should not be automatically pr...
Definition: internal.h:351
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1018
npptranspose_class
static const AVClass npptranspose_class
Definition: vf_transpose_npp.c:441
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
AVHWFramesContext::format
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:197
supported_formats
static enum AVPixelFormat supported_formats[]
Definition: vf_transpose_npp.c:38
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:130
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:322
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:344
pixdesc.h
AVFrame::width
int width
Definition: frame.h:416
av_hwframe_ctx_alloc
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:248
AVOption
AVOption.
Definition: opt.h:346
NPPTransposeStageContext::frame
AVFrame * frame
Definition: vf_transpose_npp.c:71
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
av_buffer_ref
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:103
Passthrough
Passthrough
Definition: vf_transpose_npp.c:56
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:170
options
static const AVOption options[]
Definition: vf_transpose_npp.c:428
AVERROR_UNKNOWN
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition: error.h:73
AVHWFramesContext::width
int width
The allocated dimensions of the frames in this pool.
Definition: hwcontext.h:217
video.h
init_stage
static int init_stage(NPPTransposeStageContext *stage, AVBufferRef *device_ctx)
Definition: vf_transpose_npp.c:114
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:365
NPPTransposeContext::dir
int dir
TransposeDir.
Definition: vf_transpose_npp.c:80
ff_vf_transpose_npp
const AVFilter ff_vf_transpose_npp
Definition: vf_transpose_npp.c:464
formats.h
NPPTransposeContext::tmp_frame
AVFrame * tmp_frame
Definition: vf_transpose_npp.c:77
npptranspose_config_props
static int npptranspose_config_props(AVFilterLink *outlink)
Definition: vf_transpose_npp.c:250
NPPTransposeStageContext::planes_in
struct NPPTransposeStageContext::@290 planes_in[3]
fail
#define fail()
Definition: checkasm.h:179
TransposeStage
TransposeStage
Definition: vf_transpose_npp.c:43
dummy
int dummy
Definition: motion.c:66
av_pix_fmt_get_chroma_sub_sample
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: pixdesc.c:2990
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:33
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:118
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
AVHWFramesContext::height
int height
Definition: hwcontext.h:217
OFFSET
#define OFFSET(x)
Definition: vf_transpose_npp.c:425
NPP_TRANSPOSE_CLOCK
@ NPP_TRANSPOSE_CLOCK
Definition: vf_transpose_npp.c:51
s
#define s(width, name)
Definition: cbs_vp9.c:198
npptranspose_rotate
static int npptranspose_rotate(AVFilterContext *ctx, NPPTransposeStageContext *stage, AVFrame *out, AVFrame *in)
Definition: vf_transpose_npp.c:288
format
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
ctx
AVFormatContext * ctx
Definition: movenc.c:48
format_is_supported
static int format_is_supported(enum AVPixelFormat fmt)
Definition: vf_transpose_npp.c:167
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:182
link
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
Definition: filter_design.txt:23
if
if(ret)
Definition: filter_design.txt:179
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
AVHWFramesContext::sw_format
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
Definition: hwcontext.h:210
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:679
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVHWFramesContext::device_ref
AVBufferRef * device_ref
A reference to the parent AVHWDeviceContext.
Definition: hwcontext.h:126
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
Transpose
Transpose
Definition: vf_transpose_npp.c:49
npptranspose_process
static int(*const npptranspose_process[])(AVFilterContext *ctx, NPPTransposeStageContext *stage, AVFrame *out, AVFrame *in)
Definition: vf_transpose_npp.c:344
NPPTransposeStageContext::stage_needed
int stage_needed
Definition: vf_transpose_npp.c:63
NPPTransposeContext
Definition: vf_transpose_npp.c:74
NPPTransposeStageContext::height
int height
Definition: vf_transpose_npp.c:68
NPP_TRANSPOSE_PT_TYPE_PORTRAIT
@ NPP_TRANSPOSE_PT_TYPE_PORTRAIT
Definition: vf_transpose_npp.c:59
NPP_TRANSPOSE_CCLOCK
@ NPP_TRANSPOSE_CCLOCK
Definition: vf_transpose_npp.c:52
CHECK_CU
#define CHECK_CU(x)
Definition: vf_transpose_npp.c:36
NPP_TRANSPOSE_PT_TYPE_LANDSCAPE
@ NPP_TRANSPOSE_PT_TYPE_LANDSCAPE
Definition: vf_transpose_npp.c:58
npptranspose_uninit
static void npptranspose_uninit(AVFilterContext *ctx)
Definition: vf_transpose_npp.c:101
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:106
NPPTransposeStageContext::out_fmt
enum AVPixelFormat out_fmt
Definition: vf_transpose_npp.c:65
NPPTransposeStageContext::in_fmt
enum AVPixelFormat in_fmt
Definition: vf_transpose_npp.c:64
internal.h
FILTER_SINGLE_PIXFMT
#define FILTER_SINGLE_PIXFMT(pix_fmt_)
Definition: internal.h:172
NPP_TRANSPOSE_CLOCK_FLIP
@ NPP_TRANSPOSE_CLOCK_FLIP
Definition: vf_transpose_npp.c:53
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
NPPTransposeContext::passthrough
int passthrough
PassthroughType, landscape passthrough mode enabled.
Definition: vf_transpose_npp.c:79
NPPTransposeContext::stages
NPPTransposeStageContext stages[STAGE_NB]
Definition: vf_transpose_npp.c:76
internal.h
common.h
npptranspose_outputs
static const AVFilterPad npptranspose_outputs[]
Definition: vf_transpose_npp.c:456
av_frame_move_ref
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:603
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:576
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:39
npptranspose_transpose
static int npptranspose_transpose(AVFilterContext *ctx, NPPTransposeStageContext *stage, AVFrame *out, AVFrame *in)
Definition: vf_transpose_npp.c:322
FLAGS
#define FLAGS
Definition: vf_transpose_npp.c:426
NPPTransposeStageContext
Definition: vf_transpose_npp.c:62
AVFilter
Filter definition.
Definition: avfilter.h:166
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:115
AVCUDADeviceContext
This struct is allocated as AVHWDeviceContext.hwctx.
Definition: hwcontext_cuda.h:42
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
AVHWFramesContext::device_ctx
AVHWDeviceContext * device_ctx
The parent AVHWDeviceContext.
Definition: hwcontext.h:134
cuda_check.h
AVFrame::height
int height
Definition: frame.h:416
NPPTransposeStageContext::width
int width
Definition: vf_transpose_npp.c:67
npptranspose_filter_frame
static int npptranspose_filter_frame(AVFilterLink *link, AVFrame *in)
Definition: vf_transpose_npp.c:385
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
avfilter.h
STAGE_NB
@ STAGE_NB
Definition: vf_transpose_npp.c:46
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
NPP_TRANSPOSE_PT_TYPE_NONE
@ NPP_TRANSPOSE_PT_TYPE_NONE
Definition: vf_transpose_npp.c:57
AVFilterContext
An instance of a filter.
Definition: avfilter.h:407
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
NPPTransposeStageContext::frames_ctx
AVBufferRef * frames_ctx
Definition: vf_transpose_npp.c:70
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:183
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
STAGE_TRANSPOSE
@ STAGE_TRANSPOSE
Definition: vf_transpose_npp.c:45
hwcontext.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:389
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
NPP_TRANSPOSE_CCLOCK_FLIP
@ NPP_TRANSPOSE_CCLOCK_FLIP
Definition: vf_transpose_npp.c:50
npptranspose_inputs
static const AVFilterPad npptranspose_inputs[]
Definition: vf_transpose_npp.c:448
int
int
Definition: ffmpeg_filter.c:409
av_hwframe_get_buffer
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
Definition: hwcontext.c:491
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:244
NPPTransposeStageContext::planes_out
struct NPPTransposeStageContext::@290 planes_out[3]
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2882
STAGE_ROTATE
@ STAGE_ROTATE
Definition: vf_transpose_npp.c:44