1 /* 2 * filter layer 3 * Copyright (c) 2007 Bobby Bingham 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 module ffmpeg.libavfilter.avfilter; 23 24 /** 25 * @file 26 * @ingroup lavfi 27 * Main libavfilter public API header 28 */ 29 30 /** 31 * @defgroup lavfi Libavfilter - graph-based frame editing library 32 * @{ 33 */ 34 35 import std.stdint; 36 import std.bitmanip; 37 import core.vararg; 38 import ffmpeg.libavutil.avutil; 39 import ffmpeg.libavutil.samplefmt; 40 import ffmpeg.libavcodec.avcodec; 41 import ffmpeg.libavfilter.internal; 42 import ffmpeg.libavfilter.formats; 43 import ffmpeg.libavfilter.avfilter_version; 44 45 @nogc nothrow extern(C): 46 /** 47 * Return the LIBAVFILTER_VERSION_INT constant. 48 */ 49 uint avfilter_version(); 50 51 /** 52 * Return the libavfilter build-time configuration. 53 */ 54 char *avfilter_configuration(); 55 56 /** 57 * Return the libavfilter license. 58 */ 59 char *avfilter_license(); 60 61 //typedef struct AVFilterContext AVFilterContext; 62 //typedef struct AVFilterLink AVFilterLink; 63 //typedef struct AVFilterPad AVFilterPad; 64 struct AVFilterFormats; 65 66 /** 67 * Get the number of elements in a NULL-terminated array of AVFilterPads (e.g. 68 * AVFilter.inputs/outputs). 69 */ 70 int avfilter_pad_count(const AVFilterPad *pads); 71 72 /** 73 * Get the name of an AVFilterPad. 74 * 75 * @param pads an array of AVFilterPads 76 * @param pad_idx index of the pad in the array it; is the caller's 77 * responsibility to ensure the index is valid 78 * 79 * @return name of the pad_idx'th pad in pads 80 */ 81 char *avfilter_pad_get_name(AVFilterPad *pads, int pad_idx); 82 83 /** 84 * Get the type of an AVFilterPad. 85 * 86 * @param pads an array of AVFilterPads 87 * @param pad_idx index of the pad in the array; it is the caller's 88 * responsibility to ensure the index is valid 89 * 90 * @return type of the pad_idx'th pad in pads 91 */ 92 AVMediaType avfilter_pad_get_type(AVFilterPad *pads, int pad_idx); 93 94 /** 95 * The number of the filter inputs is not determined just by AVFilter.inputs. 96 * The filter might add additional inputs during initialization depending on the 97 * options supplied to it. 98 */ 99 enum AVFILTER_FLAG_DYNAMIC_INPUTS = (1 << 0); 100 /** 101 * The number of the filter outputs is not determined just by AVFilter.outputs. 102 * The filter might add additional outputs during initialization depending on 103 * the options supplied to it. 104 */ 105 enum AVFILTER_FLAG_DYNAMIC_OUTPUTS = (1 << 1); 106 /** 107 * The filter supports multithreading by splitting frames into multiple parts 108 * and processing them concurrently. 109 */ 110 enum AVFILTER_FLAG_SLICE_THREADS = (1 << 2); 111 /** 112 * Some filters support a generic "enable" expression option that can be used 113 * to enable or disable a filter in the timeline. Filters supporting this 114 * option have this flag set. When the enable expression is false, the default 115 * no-op filter_frame() function is called in place of the filter_frame() 116 * callback defined on each input pad, thus the frame is passed unchanged to 117 * the next filters. 118 */ 119 enum AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC= (1 << 16); 120 /** 121 * Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will 122 * have its filter_frame() callback(s) called as usual even when the enable 123 * expression is false. The filter will disable filtering within the 124 * filter_frame() callback(s) itself, for example executing code depending on 125 * the AVFilterContext->is_disabled value. 126 */ 127 enum AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL=(1 << 17); 128 /** 129 * Handy mask to test whether the filter supports or no the timeline feature 130 * (internally or generically). 131 */ 132 enum AVFILTER_FLAG_SUPPORT_TIMELINE=(AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL); 133 134 /** 135 * Filter definition. This defines the pads a filter contains, and all the 136 * callback functions used to interact with the filter. 137 */ 138 struct AVFilter { 139 /** 140 * Filter name. Must be non-NULL and unique among filters. 141 */ 142 const char *name; 143 144 /** 145 * A description of the filter. May be NULL. 146 * 147 * You should use the NULL_IF_CONFIG_SMALL() macro to define it. 148 */ 149 const char *description; 150 151 /** 152 * List of inputs, terminated by a zeroed element. 153 * 154 * NULL if there are no (static) inputs. Instances of filters with 155 * AVFILTER_FLAG_DYNAMIC_INPUTS set may have more inputs than present in 156 * this list. 157 */ 158 const AVFilterPad *inputs; 159 /** 160 * List of outputs, terminated by a zeroed element. 161 * 162 * NULL if there are no (static) outputs. Instances of filters with 163 * AVFILTER_FLAG_DYNAMIC_OUTPUTS set may have more outputs than present in 164 * this list. 165 */ 166 const AVFilterPad *outputs; 167 168 /** 169 * A class for the private data, used to declare filter private AVOptions. 170 * This field is NULL for filters that do not declare any options. 171 * 172 * If this field is non-NULL, the first member of the filter private data 173 * must be a pointer to AVClass, which will be set by libavfilter generic 174 * code to this class. 175 */ 176 const AVClass *priv_class; 177 178 /** 179 * A combination of AVFILTER_FLAG_* 180 */ 181 int flags; 182 183 /***************************************************************** 184 * All fields below this line are not part of the public API. They 185 * may not be used outside of libavfilter and can be changed and 186 * removed at will. 187 * New public fields should be added right above. 188 ***************************************************************** 189 */ 190 191 /** 192 * Filter initialization function. 193 * 194 * This callback will be called only once during the filter lifetime, after 195 * all the options have been set, but before links between filters are 196 * established and format negotiation is done. 197 * 198 * Basic filter initialization should be done here. Filters with dynamic 199 * inputs and/or outputs should create those inputs/outputs here based on 200 * provided options. No more changes to this filter's inputs/outputs can be 201 * done after this callback. 202 * 203 * This callback must not assume that the filter links exist or frame 204 * parameters are known. 205 * 206 * @ref AVFilter.uninit "uninit" is guaranteed to be called even if 207 * initialization fails, so this callback does not have to clean up on 208 * failure. 209 * 210 * @return 0 on success, a negative AVERROR on failure 211 */ 212 int function(AVFilterContext *ctx) init; 213 214 /** 215 * Should be set instead of @ref AVFilter.init "init" by the filters that 216 * want to pass a dictionary of AVOptions to nested contexts that are 217 * allocated during init. 218 * 219 * On return, the options dict should be freed and replaced with one that 220 * contains all the options which could not be processed by this filter (or 221 * with NULL if all the options were processed). 222 * 223 * Otherwise the semantics is the same as for @ref AVFilter.init "init". 224 */ 225 int function(AVFilterContext *ctx, AVDictionary **options) init_dict; 226 227 /** 228 * Filter uninitialization function. 229 * 230 * Called only once right before the filter is freed. Should deallocate any 231 * memory held by the filter, release any buffer references, etc. It does 232 * not need to deallocate the AVFilterContext.priv memory itself. 233 * 234 * This callback may be called even if @ref AVFilter.init "init" was not 235 * called or failed, so it must be prepared to handle such a situation. 236 */ 237 void function(AVFilterContext *ctx) uninit; 238 239 /** 240 * Query formats supported by the filter on its inputs and outputs. 241 * 242 * This callback is called after the filter is initialized (so the inputs 243 * and outputs are fixed), shortly before the format negotiation. This 244 * callback may be called more than once. 245 * 246 * This callback must set AVFilterLink.out_formats on every input link and 247 * AVFilterLink.in_formats on every output link to a list of pixel/sample 248 * formats that the filter supports on that link. For audio links, this 249 * filter must also set @ref AVFilterLink.in_samplerates "in_samplerates" / 250 * @ref AVFilterLink.out_samplerates "out_samplerates" and 251 * @ref AVFilterLink.in_channel_layouts "in_channel_layouts" / 252 * @ref AVFilterLink.out_channel_layouts "out_channel_layouts" analogously. 253 * 254 * This callback may be NULL for filters with one input, in which case 255 * libavfilter assumes that it supports all input formats and preserves 256 * them on output. 257 * 258 * @return zero on success, a negative value corresponding to an 259 * AVERROR code otherwise 260 */ 261 int function(AVFilterContext *) query_formats; 262 263 int priv_size; ///< size of private data to allocate for the filter 264 265 /** 266 * Used by the filter registration system. Must not be touched by any other 267 * code. 268 */ 269 AVFilter *next; 270 271 /** 272 * Make the filter instance process a command. 273 * 274 * @param cmd the command to process, for handling simplicity all commands must be alphanumeric only 275 * @param arg the argument for the command 276 * @param res a buffer with size res_size where the filter(s) can return a response. This must not change when the command is not supported. 277 * @param flags if AVFILTER_CMD_FLAG_FAST is set and the command would be 278 * time consuming then a filter should treat it like an unsupported command 279 * 280 * @returns >=0 on success otherwise an error code. 281 * AVERROR(ENOSYS) on unsupported commands 282 */ 283 int function(AVFilterContext *, const char *cmd, const char *arg, char *res, int res_len, int flags) process_command; 284 285 /** 286 * Filter initialization function, alternative to the init() 287 * callback. Args contains the user-supplied parameters, opaque is 288 * used for providing binary data. 289 */ 290 int function(AVFilterContext *ctx, void *opaque) init_opaque; 291 } 292 293 /** 294 * Process multiple parts of the frame concurrently. 295 */ 296 enum AVFILTER_THREAD_SLICE=(1 << 0); 297 298 struct AVFilterInternal; 299 /** An instance of a filter */ 300 struct AVFilterContext { 301 const AVClass *av_class; ///< needed for av_log() and filters common options 302 303 const AVFilter *filter; ///< the AVFilter of which this is an instance 304 305 char *name; ///< name of this filter instance 306 307 AVFilterPad *input_pads; ///< array of input pads 308 AVFilterLink **inputs; ///< array of pointers to input links 309 uint nb_inputs; ///< number of input pads 310 311 AVFilterPad *output_pads; ///< array of output pads 312 AVFilterLink **outputs; ///< array of pointers to output links 313 uint nb_outputs; ///< number of output pads 314 315 void *priv; ///< private data for use by the filter 316 317 AVFilterGraph *graph; ///< filtergraph this filter belongs to 318 319 /** 320 * Type of multithreading being allowed/used. A combination of 321 * AVFILTER_THREAD_* flags. 322 * 323 * May be set by the caller before initializing the filter to forbid some 324 * or all kinds of multithreading for this filter. The default is allowing 325 * everything. 326 * 327 * When the filter is initialized, this field is combined using bit AND with 328 * AVFilterGraph.thread_type to get the final mask used for determining 329 * allowed threading types. I.e. a threading type needs to be set in both 330 * to be allowed. 331 * 332 * After the filter is initialized, libavfilter sets this field to the 333 * threading type that is actually used (0 for no multithreading). 334 */ 335 int thread_type; 336 337 /** 338 * An opaque struct for libavfilter internal use. 339 */ 340 AVFilterInternal *internal; 341 342 AVFilterCommand *command_queue; 343 344 char *enable_str; ///< enable expression string 345 void *enable; ///< parsed expression (AVExpr*) 346 double *var_values; ///< variable values for the enable expression 347 int is_disabled; ///< the enabled state from the last expression evaluation 348 } 349 350 /** 351 * A link between two filters. This contains pointers to the source and 352 * destination filters between which this link exists, and the indexes of 353 * the pads involved. In addition, this link also contains the parameters 354 * which have been negotiated and agreed upon between the filter, such as 355 * image dimensions, format, etc. 356 */ 357 struct AVFilterLink { 358 AVFilterContext *src; ///< source filter 359 AVFilterPad *srcpad; ///< output pad on the source filter 360 361 AVFilterContext *dst; ///< dest filter 362 AVFilterPad *dstpad; ///< input pad on the dest filter 363 364 AVMediaType type; ///< filter media type 365 366 /* These parameters apply only to video */ 367 int w; ///< agreed upon image width 368 int h; ///< agreed upon image height 369 AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio 370 /* These parameters apply only to audio */ 371 uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/channel_layout.h) 372 int sample_rate; ///< samples per second 373 374 int format; ///< agreed upon media format 375 376 /** 377 * Define the time base used by the PTS of the frames/samples 378 * which will pass through this link. 379 * During the configuration stage, each filter is supposed to 380 * change only the output timebase, while the timebase of the 381 * input link is assumed to be an unchangeable property. 382 */ 383 AVRational time_base; 384 385 /***************************************************************** 386 * All fields below this line are not part of the public API. They 387 * may not be used outside of libavfilter and can be changed and 388 * removed at will. 389 * New public fields should be added right above. 390 ***************************************************************** 391 */ 392 /** 393 * Lists of formats and channel layouts supported by the input and output 394 * filters respectively. These lists are used for negotiating the format 395 * to actually be used, which will be loaded into the format and 396 * channel_layout members, above, when chosen. 397 * 398 */ 399 AVFilterFormats *in_formats; 400 AVFilterFormats *out_formats; 401 402 /** 403 * Lists of channel layouts and sample rates used for automatic 404 * negotiation. 405 */ 406 AVFilterFormats *in_samplerates; 407 AVFilterFormats *out_samplerates; 408 AVFilterChannelLayouts *in_channel_layouts; 409 AVFilterChannelLayouts *out_channel_layouts; 410 411 /** 412 * Audio only, the destination filter sets this to a non-zero value to 413 * request that buffers with the given number of samples should be sent to 414 * it. AVFilterPad.needs_fifo must also be set on the corresponding input 415 * pad. 416 * Last buffer before EOF will be padded with silence. 417 */ 418 int request_samples; 419 420 /** stage of the initialization of the link properties (dimensions, etc) */ 421 enum init_state { 422 AVLINK_UNINIT = 0, ///< not started 423 AVLINK_STARTINIT, ///< started, but incomplete 424 AVLINK_INIT ///< complete 425 } 426 427 /** 428 * Graph the filter belongs to. 429 */ 430 AVFilterGraph *graph; 431 432 /** 433 * Current timestamp of the link, as defined by the most recent 434 * frame(s), in AV_TIME_BASE units. 435 */ 436 int64_t current_pts; 437 438 /** 439 * Current timestamp of the link, as defined by the most recent 440 * frame(s), in AV_TIME_BASE units. 441 */ 442 int64_t current_pts_us; 443 444 /** 445 * Index in the age array. 446 */ 447 int age_index; 448 449 /** 450 * Frame rate of the stream on the link, or 1/0 if unknown; 451 * if left to 0/0, will be automatically be copied from the first input 452 * of the source filter if it exists. 453 * 454 * Sources should set it to the best estimation of the real frame rate. 455 * Filters should update it if necessary depending on their function. 456 * Sinks can use it to set a default output frame rate. 457 * It is similar to the r_frame_rate field in AVStream. 458 */ 459 AVRational frame_rate; 460 461 /** 462 * Buffer partially filled with samples to achieve a fixed/minimum size. 463 */ 464 AVFrame *partial_buf; 465 466 /** 467 * Size of the partial buffer to allocate. 468 * Must be between min_samples and max_samples. 469 */ 470 int partial_buf_size; 471 472 /** 473 * Minimum number of samples to filter at once. If filter_frame() is 474 * called with fewer samples, it will accumulate them in partial_buf. 475 * This field and the related ones must not be changed after filtering 476 * has started. 477 * If 0, all related fields are ignored. 478 */ 479 int min_samples; 480 481 /** 482 * Maximum number of samples to filter at once. If filter_frame() is 483 * called with more samples, it will split them. 484 */ 485 int max_samples; 486 487 /** 488 * Link status. 489 * If not zero, all attempts of filter_frame or request_frame 490 * will fail with the corresponding code, and if necessary the reference 491 * will be destroyed. 492 * If request_frame returns an error, the status is set on the 493 * corresponding link. 494 * It can be set also be set by either the source or the destination 495 * filter. 496 */ 497 int status; 498 499 /** 500 * Number of channels. 501 */ 502 int channels; 503 504 /** 505 * Link processing flags. 506 */ 507 uint flags; 508 509 /** 510 * Number of past frames sent through the link. 511 */ 512 int64_t frame_count; 513 514 /** 515 * A pointer to a FFVideoFramePool struct. 516 */ 517 void *video_frame_pool; 518 519 /** 520 * True if a frame is currently wanted on the input of this filter. 521 * Set when ff_request_frame() is called by the output, 522 * cleared when the request is handled or forwarded. 523 */ 524 int frame_wanted_in; 525 526 /** 527 * True if a frame is currently wanted on the output of this filter. 528 * Set when ff_request_frame() is called by the output, 529 * cleared when a frame is filtered. 530 */ 531 int frame_wanted_out; 532 } 533 534 /** 535 * Link two filters together. 536 * 537 * @param src the source filter 538 * @param srcpad index of the output pad on the source filter 539 * @param dst the destination filter 540 * @param dstpad index of the input pad on the destination filter 541 * @return zero on success 542 */ 543 int avfilter_link(AVFilterContext *src, uint srcpad, 544 AVFilterContext *dst, uint dstpad); 545 546 /** 547 * Free the link in *link, and set its pointer to NULL. 548 */ 549 void avfilter_link_free(AVFilterLink **link); 550 551 /** 552 * Get the number of channels of a link. 553 */ 554 int avfilter_link_get_channels(AVFilterLink *link); 555 556 /** 557 * Set the closed field of a link. 558 * @deprecated applications are not supposed to mess with links, they should 559 * close the sinks. 560 */ 561 deprecated 562 void avfilter_link_set_closed(AVFilterLink *link, int closed); 563 564 /** 565 * Negotiate the media format, dimensions, etc of all inputs to a filter. 566 * 567 * @param filter the filter to negotiate the properties for its inputs 568 * @return zero on successful negotiation 569 */ 570 int avfilter_config_links(AVFilterContext *filter); 571 572 const uint AVFILTER_CMD_FLAG_ONE = 1; ///< Stop once a filter understood the command (for target=all for example), fast filters are favored automatically 573 const uint AVFILTER_CMD_FLAG_FAST = 2; ///< Only execute command when its fast (like a video out that supports contrast adjustment in hw) 574 575 /** 576 * Make the filter instance process a command. 577 * It is recommended to use avfilter_graph_send_command(). 578 */ 579 int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags); 580 581 /** Initialize the filter system. Register all builtin filters. */ 582 void avfilter_register_all(); 583 584 static if (FF_API_OLD_FILTER_REGISTER) { 585 /** Uninitialize the filter system. Unregister all filters. */ 586 deprecated 587 void avfilter_uninit(); 588 } 589 590 /** 591 * Register a filter. This is only needed if you plan to use 592 * avfilter_get_by_name later to lookup the AVFilter structure by name. A 593 * filter can still by instantiated with avfilter_graph_alloc_filter even if it 594 * is not registered. 595 * 596 * @param filter the filter to register 597 * @return 0 if the registration was successful, a negative value 598 * otherwise 599 */ 600 int avfilter_register(AVFilter *filter); 601 602 /** 603 * Get a filter definition matching the given name. 604 * 605 * @param name the filter name to find 606 * @return the filter definition, if any matching one is registered. 607 * NULL if none found. 608 */ 609 //#if !FF_API_NOCONST_GET_NAME 610 //const 611 //#endif 612 AVFilter *avfilter_get_by_name(const char *name); 613 614 /** 615 * Iterate over all registered filters. 616 * @return If prev is non-NULL, next registered filter after prev or NULL if 617 * prev is the last filter. If prev is NULL, return the first registered filter. 618 */ 619 AVFilter *avfilter_next(const AVFilter *prev); 620 621 static if (FF_API_OLD_FILTER_REGISTER) { 622 /** 623 * If filter is NULL, returns a pointer to the first registered filter pointer, 624 * if filter is non-NULL, returns the next pointer after filter. 625 * If the returned pointer points to NULL, the last registered filter 626 * was already reached. 627 * @deprecated use avfilter_next() 628 */ 629 deprecated 630 AVFilter **av_filter_next(AVFilter **filter); 631 } 632 633 static if (FF_API_AVFILTER_OPEN) { 634 /** 635 * Create a filter instance. 636 * 637 * @param filter_ctx put here a pointer to the created filter context 638 * on success, NULL on failure 639 * @param filter the filter to create an instance of 640 * @param inst_name Name to give to the new instance. Can be NULL for none. 641 * @return >= 0 in case of success, a negative error code otherwise 642 * @deprecated use avfilter_graph_alloc_filter() instead 643 */ 644 deprecated 645 int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); 646 } 647 648 649 static if (FF_API_AVFILTER_INIT_FILTER) { 650 /** 651 * Initialize a filter. 652 * 653 * @param filter the filter to initialize 654 * @param args A string of parameters to use when initializing the filter. 655 * The format and meaning of this string varies by filter. 656 * @param opaque Any extra non-string data needed by the filter. The meaning 657 * of this parameter varies by filter. 658 * @return zero on success 659 */ 660 deprecated 661 int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); 662 } 663 664 /** 665 * Initialize a filter with the supplied parameters. 666 * 667 * @param ctx uninitialized filter context to initialize 668 * @param args Options to initialize the filter with. This must be a 669 * ':'-separated list of options in the 'key=value' form. 670 * May be NULL if the options have been set directly using the 671 * AVOptions API or there are no options that need to be set. 672 * @return 0 on success, a negative AVERROR on failure 673 */ 674 int avfilter_init_str(AVFilterContext *ctx, const char *args); 675 676 /** 677 * Initialize a filter with the supplied dictionary of options. 678 * 679 * @param ctx uninitialized filter context to initialize 680 * @param options An AVDictionary filled with options for this filter. On 681 * return this parameter will be destroyed and replaced with 682 * a dict containing options that were not found. This dictionary 683 * must be freed by the caller. 684 * May be NULL, then this function is equivalent to 685 * avfilter_init_str() with the second parameter set to NULL. 686 * @return 0 on success, a negative AVERROR on failure 687 * 688 * @note This function and avfilter_init_str() do essentially the same thing, 689 * the difference is in manner in which the options are passed. It is up to the 690 * calling code to choose whichever is more preferable. The two functions also 691 * behave differently when some of the provided options are not declared as 692 * supported by the filter. In such a case, avfilter_init_str() will fail, but 693 * this function will leave those extra options in the options AVDictionary and 694 * continue as usual. 695 */ 696 int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options); 697 698 /** 699 * Free a filter context. This will also remove the filter from its 700 * filtergraph's list of filters. 701 * 702 * @param filter the filter to free 703 */ 704 void avfilter_free(AVFilterContext *filter); 705 706 /** 707 * Insert a filter in the middle of an existing link. 708 * 709 * @param link the link into which the filter should be inserted 710 * @param filt the filter to be inserted 711 * @param filt_srcpad_idx the input pad on the filter to connect 712 * @param filt_dstpad_idx the output pad on the filter to connect 713 * @return zero on success 714 */ 715 int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, 716 uint filt_srcpad_idx, uint filt_dstpad_idx); 717 718 /** 719 * @return AVClass for AVFilterContext. 720 * 721 * @see av_opt_find(). 722 */ 723 AVClass *avfilter_get_class(); 724 725 struct AVFilterGraphInternal; 726 727 /** 728 * A function pointer passed to the @ref AVFilterGraph.execute callback to be 729 * executed multiple times, possibly in parallel. 730 * 731 * @param ctx the filter context the job belongs to 732 * @param arg an opaque parameter passed through from @ref 733 * AVFilterGraph.execute 734 * @param jobnr the index of the job being executed 735 * @param nb_jobs the total number of jobs 736 * 737 * @return 0 on success, a negative AVERROR on error 738 */ 739 alias avfilter_action_func = int function (AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); 740 741 /** 742 * A function executing multiple jobs, possibly in parallel. 743 * 744 * @param ctx the filter context to which the jobs belong 745 * @param func the function to be called multiple times 746 * @param arg the argument to be passed to func 747 * @param ret a nb_jobs-sized array to be filled with return values from each 748 * invocation of func 749 * @param nb_jobs the number of jobs to execute 750 * 751 * @return 0 on success, a negative AVERROR on error 752 */ 753 alias avfilter_execute_func = int function(AVFilterContext *ctx, avfilter_action_func *func, 754 void *arg, int *ret, int nb_jobs); 755 756 struct AVFilterGraph { 757 const AVClass *av_class; 758 AVFilterContext **filters; 759 uint nb_filters; 760 761 char *scale_sws_opts; ///< sws options to use for the auto-inserted scale filters 762 char *resample_lavr_opts; ///< libavresample options to use for the auto-inserted resample filters 763 764 /** 765 * Type of multithreading allowed for filters in this graph. A combination 766 * of AVFILTER_THREAD_* flags. 767 * 768 * May be set by the caller at any point, the setting will apply to all 769 * filters initialized after that. The default is allowing everything. 770 * 771 * When a filter in this graph is initialized, this field is combined using 772 * bit AND with AVFilterContext.thread_type to get the final mask used for 773 * determining allowed threading types. I.e. a threading type needs to be 774 * set in both to be allowed. 775 */ 776 int thread_type; 777 778 /** 779 * Maximum number of threads used by filters in this graph. May be set by 780 * the caller before adding any filters to the filtergraph. Zero (the 781 * default) means that the number of threads is determined automatically. 782 */ 783 int nb_threads; 784 785 /** 786 * Opaque object for libavfilter internal use. 787 */ 788 AVFilterGraphInternal *internal; 789 790 /** 791 * Opaque user data. May be set by the caller to an arbitrary value, e.g. to 792 * be used from callbacks like @ref AVFilterGraph.execute. 793 * Libavfilter will not touch this field in any way. 794 */ 795 void *opaque; 796 797 /** 798 * This callback may be set by the caller immediately after allocating the 799 * graph and before adding any filters to it, to provide a custom 800 * multithreading implementation. 801 * 802 * If set, filters with slice threading capability will call this callback 803 * to execute multiple jobs in parallel. 804 * 805 * If this field is left unset, libavfilter will use its internal 806 * implementation, which may or may not be multithreaded depending on the 807 * platform and build options. 808 */ 809 avfilter_execute_func *execute; 810 811 char *aresample_swr_opts; ///< swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions 812 813 /** 814 * Private fields 815 * 816 * The following fields are for internal use only. 817 * Their type, offset, number and semantic can change without notice. 818 */ 819 820 AVFilterLink **sink_links; 821 int sink_links_count; 822 823 uint disable_auto_convert; 824 } 825 826 /** 827 * Allocate a filter graph. 828 */ 829 AVFilterGraph *avfilter_graph_alloc(); 830 831 /** 832 * Create a new filter instance in a filter graph. 833 * 834 * @param graph graph in which the new filter will be used 835 * @param filter the filter to create an instance of 836 * @param name Name to give to the new instance (will be copied to 837 * AVFilterContext.name). This may be used by the caller to identify 838 * different filters, libavfilter itself assigns no semantics to 839 * this parameter. May be NULL. 840 * 841 * @return the context of the newly created filter instance (note that it is 842 * also retrievable directly through AVFilterGraph.filters or with 843 * avfilter_graph_get_filter()) on success or NULL on failure. 844 */ 845 AVFilterContext *avfilter_graph_alloc_filter(AVFilterGraph *graph, 846 const AVFilter *filter, 847 const char *name); 848 849 /** 850 * Get a filter instance identified by instance name from graph. 851 * 852 * @param graph filter graph to search through. 853 * @param name filter instance name (should be unique in the graph). 854 * @return the pointer to the found filter instance or NULL if it 855 * cannot be found. 856 */ 857 AVFilterContext *avfilter_graph_get_filter(AVFilterGraph *graph, const char *name); 858 859 static if (FF_API_AVFILTER_OPEN) { 860 /** 861 * Add an existing filter instance to a filter graph. 862 * 863 * @param graphctx the filter graph 864 * @param filter the filter to be added 865 * 866 * @deprecated use avfilter_graph_alloc_filter() to allocate a filter in a 867 * filter graph 868 */ 869 deprecated 870 int avfilter_graph_add_filter(AVFilterGraph *graphctx, AVFilterContext *filter); 871 } 872 873 /** 874 * Create and add a filter instance into an existing graph. 875 * The filter instance is created from the filter filt and inited 876 * with the parameters args and opaque. 877 * 878 * In case of success put in *filt_ctx the pointer to the created 879 * filter instance, otherwise set *filt_ctx to NULL. 880 * 881 * @param name the instance name to give to the created filter instance 882 * @param graph_ctx the filter graph 883 * @return a negative AVERROR error code in case of failure, a non 884 * negative value otherwise 885 */ 886 int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, 887 const char *name, const char *args, void *opaque, 888 AVFilterGraph *graph_ctx); 889 890 /** 891 * Enable or disable automatic format conversion inside the graph. 892 * 893 * Note that format conversion can still happen inside explicitly inserted 894 * scale and aresample filters. 895 * 896 * @param flags any of the AVFILTER_AUTO_CONVERT_* constants 897 */ 898 void avfilter_graph_set_auto_convert(AVFilterGraph *graph, uint flags); 899 900 enum { 901 AVFILTER_AUTO_CONVERT_ALL = 0, /**< all automatic conversions enabled */ 902 AVFILTER_AUTO_CONVERT_NONE = -1 /**< all automatic conversions disabled */ 903 } 904 905 /** 906 * Check validity and configure all the links and formats in the graph. 907 * 908 * @param graphctx the filter graph 909 * @param log_ctx context used for logging 910 * @return >= 0 in case of success, a negative AVERROR code otherwise 911 */ 912 int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx); 913 914 /** 915 * Free a graph, destroy its links, and set *graph to NULL. 916 * If *graph is NULL, do nothing. 917 */ 918 void avfilter_graph_free(AVFilterGraph **graph); 919 920 /** 921 * A linked-list of the inputs/outputs of the filter chain. 922 * 923 * This is mainly useful for avfilter_graph_parse() / avfilter_graph_parse2(), 924 * where it is used to communicate open (unlinked) inputs and outputs from and 925 * to the caller. 926 * This struct specifies, per each not connected pad contained in the graph, the 927 * filter context and the pad index required for establishing a link. 928 */ 929 struct AVFilterInOut { 930 /** unique name for this input/output in the list */ 931 char *name; 932 933 /** filter context associated to this input/output */ 934 AVFilterContext *filter_ctx; 935 936 /** index of the filt_ctx pad to use for linking */ 937 int pad_idx; 938 939 /** next input/input in the list, NULL if this is the last */ 940 AVFilterInOut *next; 941 } 942 943 /** 944 * Allocate a single AVFilterInOut entry. 945 * Must be freed with avfilter_inout_free(). 946 * @return allocated AVFilterInOut on success, NULL on failure. 947 */ 948 AVFilterInOut *avfilter_inout_alloc(); 949 950 /** 951 * Free the supplied list of AVFilterInOut and set *inout to NULL. 952 * If *inout is NULL, do nothing. 953 */ 954 void avfilter_inout_free(AVFilterInOut **_inout); 955 956 /** 957 * Add a graph described by a string to a graph. 958 * 959 * @note The caller must provide the lists of inputs and outputs, 960 * which therefore must be known before calling the function. 961 * 962 * @note The inputs parameter describes inputs of the already existing 963 * part of the graph; i.e. from the point of view of the newly created 964 * part, they are outputs. Similarly the outputs parameter describes 965 * outputs of the already existing filters, which are provided as 966 * inputs to the parsed filters. 967 * 968 * @param graph the filter graph where to link the parsed graph context 969 * @param filters string to be parsed 970 * @param inputs linked list to the inputs of the graph 971 * @param outputs linked list to the outputs of the graph 972 * @return zero on success, a negative AVERROR code on error 973 */ 974 int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, 975 AVFilterInOut *inputs, AVFilterInOut *outputs, 976 void *log_ctx); 977 978 /** 979 * Add a graph described by a string to a graph. 980 * 981 * @param graph the filter graph where to link the parsed graph context 982 * @param filters string to be parsed 983 * @param inputs pointer to a linked list to the inputs of the graph, may be NULL. 984 * If non-NULL, *inputs is updated to contain the list of open inputs 985 * after the parsing, should be freed with avfilter_inout_free(). 986 * @param outputs pointer to a linked list to the outputs of the graph, may be NULL. 987 * If non-NULL, *outputs is updated to contain the list of open outputs 988 * after the parsing, should be freed with avfilter_inout_free(). 989 * @return non negative on success, a negative AVERROR code on error 990 */ 991 int avfilter_graph_parse_ptr(AVFilterGraph *graph, const char *filters, 992 AVFilterInOut **inputs, AVFilterInOut **outputs, 993 void *log_ctx); 994 995 /** 996 * Add a graph described by a string to a graph. 997 * 998 * @param[in] graph the filter graph where to link the parsed graph context 999 * @param[in] filters string to be parsed 1000 * @param[out] inputs a linked list of all free (unlinked) inputs of the 1001 * parsed graph will be returned here. It is to be freed 1002 * by the caller using avfilter_inout_free(). 1003 * @param[out] outputs a linked list of all free (unlinked) outputs of the 1004 * parsed graph will be returned here. It is to be freed by the 1005 * caller using avfilter_inout_free(). 1006 * @return zero on success, a negative AVERROR code on error 1007 * 1008 * @note This function returns the inputs and outputs that are left 1009 * unlinked after parsing the graph and the caller then deals with 1010 * them. 1011 * @note This function makes no reference whatsoever to already 1012 * existing parts of the graph and the inputs parameter will on return 1013 * contain inputs of the newly parsed part of the graph. Analogously 1014 * the outputs parameter will contain outputs of the newly created 1015 * filters. 1016 */ 1017 int avfilter_graph_parse2(AVFilterGraph *graph, const char *filters, 1018 AVFilterInOut **inputs, 1019 AVFilterInOut **outputs); 1020 1021 /** 1022 * Send a command to one or more filter instances. 1023 * 1024 * @param graph the filter graph 1025 * @param target the filter(s) to which the command should be sent 1026 * "all" sends to all filters 1027 * otherwise it can be a filter or filter instance name 1028 * which will send the command to all matching filters. 1029 * @param cmd the command to send, for handling simplicity all commands must be alphanumeric only 1030 * @param arg the argument for the command 1031 * @param res a buffer with size res_size where the filter(s) can return a response. 1032 * 1033 * @returns >=0 on success otherwise an error code. 1034 * AVERROR(ENOSYS) on unsupported commands 1035 */ 1036 int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags); 1037 1038 /** 1039 * Queue a command for one or more filter instances. 1040 * 1041 * @param graph the filter graph 1042 * @param target the filter(s) to which the command should be sent 1043 * "all" sends to all filters 1044 * otherwise it can be a filter or filter instance name 1045 * which will send the command to all matching filters. 1046 * @param cmd the command to sent, for handling simplicity all commands must be alphanumeric only 1047 * @param arg the argument for the command 1048 * @param ts time at which the command should be sent to the filter 1049 * 1050 * @note As this executes commands after this function returns, no return code 1051 * from the filter is provided, also AVFILTER_CMD_FLAG_ONE is not supported. 1052 */ 1053 int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, int flags, double ts); 1054 1055 1056 /** 1057 * Dump a graph into a human-readable string representation. 1058 * 1059 * @param graph the graph to dump 1060 * @param options formatting options; currently ignored 1061 * @return a string, or NULL in case of memory allocation failure; 1062 * the string must be freed using av_free 1063 */ 1064 char *avfilter_graph_dump(AVFilterGraph *graph, const char *options); 1065 1066 /** 1067 * Request a frame on the oldest sink link. 1068 * 1069 * If the request returns AVERROR_EOF, try the next. 1070 * 1071 * Note that this function is not meant to be the sole scheduling mechanism 1072 * of a filtergraph, only a convenience function to help drain a filtergraph 1073 * in a balanced way under normal circumstances. 1074 * 1075 * Also note that AVERROR_EOF does not mean that frames did not arrive on 1076 * some of the sinks during the process. 1077 * When there are multiple sink links, in case the requested link 1078 * returns an EOF, this may cause a filter to flush pending frames 1079 * which are sent to another sink link, although unrequested. 1080 * 1081 * @return the return value of ff_request_frame(), 1082 * or AVERROR_EOF if all links returned AVERROR_EOF 1083 */ 1084 int avfilter_graph_request_oldest(AVFilterGraph *graph); 1085 1086 /** 1087 * @} 1088 */