annotate DOCS/tech/libmpcodecs.txt @ 33263:5f527a9a9521

Add an exit function. This function will allow performing clean-up operations. (MPlayer calls guiDone() before exiting, but only if the GUI has been initialized, i.e. if guiInit() has been called successfully. Any exit_player()/exit_player_with_rc() after GUI's cfg_read() until guiInit(), or any exit_player() during guiInit() itself will end the GUI without calling guiDone(). This exit function will at least handle abortions during guiInit() itself. It will be called twice in case of an guiExit() after GUI initialization - first directly, next by guiDone() via MPlayer's exit_player_with_rc().)
author ib
date Tue, 03 May 2011 12:19:22 +0000
parents c02ae498fb2e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25880
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25872
diff changeset
1 NOTE: If you want to implement a new native codec, please add it to
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25872
diff changeset
2 libavcodec. libmpcodecs is considered mostly deprecated, except for wrappers
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25872
diff changeset
3 around external libraries and codecs requiring binary support.
25872
3eeaf9d4c65a note on new demuxers and codecs, add them to lav* instead of libmp*
ivo
parents: 15624
diff changeset
4
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
5 The libMPcodecs API details, hints - by A'rpi
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
6 ==================================
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
7
7399
56bb20a00bc9 cross-ref
arpi
parents: 7397
diff changeset
8 See also: colorspaces.txt, codec-devel.txt, dr-methods.txt, codecs.conf.txt
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
9
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
10 The VIDEO path:
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
11 ===============
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
12
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
13 [MPlayer core]
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
14 | (1)
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
15 ______V______ (2) /~~~~~~~~~~\ (3,4) |~~~~~~|
28267
757aca6254a3 Fix decvideo vs. dec_video typo noticed by Vineeth N, nvineeth gmail com.
diego
parents: 25880
diff changeset
16 | | -----> | vd_XXX.c | -------> | vd.c |
757aca6254a3 Fix decvideo vs. dec_video typo noticed by Vineeth N, nvineeth gmail com.
diego
parents: 25880
diff changeset
17 | dec_video | \__________/ <-(3a)-- |______|
757aca6254a3 Fix decvideo vs. dec_video typo noticed by Vineeth N, nvineeth gmail com.
diego
parents: 25880
diff changeset
18 | | -----, ,.............(3a,4a).....:
757aca6254a3 Fix decvideo vs. dec_video typo noticed by Vineeth N, nvineeth gmail com.
diego
parents: 25880
diff changeset
19 ~~~~~~~~~~~~~ (6) V V
15602
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
20 /~~~~~~~~\ /~~~~~~~~\ (8)
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
21 | vf_X.c | --> | vf_Y.c | ----> vf_vo.c / ve_XXX.c
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
22 \________/ \________/
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
23 | ^
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
24 (7) | |~~~~~~| : (7a)
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
25 `-> | vf.c |...:
d6f9191f4f82 Tab to space conversion to prevent the ASCII diagram to be messed up when a
diego
parents: 9687
diff changeset
26 |______|
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
27
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
28 Short description of video path:
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
29 1. MPlayer/MEncoder core requests the decoding of a compressed video frame:
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
30 calls dec_video.c::decode_video().
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
31
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
32 2. decode_video() calls the video codec previously selected in init_video().
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
33 (vd_XXX.c file, where XXX == vfm name, see the 'driver' line of codecs.conf)
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
34
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
35 3. The codec should initialize the output device before decoding the first
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
36 frame. It may happen in init() or at the middle of the first decode(), see
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
37 3a. It means calling vd.c::mpcodecs_config_vo() with the image dimensions,
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
38 and the _preferred_ (meaning: internal, native, best) colorspace.
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
39 NOTE: This colorspace may not be equal to the colorspace that is actually
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
40 used. It's just a _hint_ for the colorspace matching algorithm and mainly
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
41 used as input format of the converter, but _only_ when colorspace
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
42 conversion is required,
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
43
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
44 3a. Selecting the best output colorspace:
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
45 The vd.c::mpcodecs_config_vo() function will go through the outfmt list
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
46 defined by the 'out' lines in codecs.conf and query both vd (codec) and
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
47 vo (output device/filter/encoder) if the format is supported or not.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
48
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
49 For the vo, it calls the query_format() function of vf_XXX.c or ve_XXX.c.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
50 It should return a set of feature flags, the most important ones for this
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
51 stage are: VFCAP_CSP_SUPPORTED (colorspace supported directly or by
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
52 conversion) and VFCAP_CSP_SUPPORTED_BY_HW (colorspace supported
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
53 WITHOUT any conversion).
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
54
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
55 For the vd (codec), control() with VDCTRL_QUERY_FORMAT will be called.
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
56 If it does not implement VDCTRL_QUERY_FORMAT, (i.e. answers CONTROL_UNKNOWN
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
57 or CONTROL_NA), it is assumed to be CONTROL_TRUE (colorspace supported)!
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
58
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
59 So, by default, if the list of supported colorspaces is constant and does
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
60 not depend on the actual file/stream header, then it is enough to list the
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
61 formats in codecs.conf ('out' field) and not implement VDCTRL_QUERY_FORMAT.
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
62 This is the case for most codecs.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
63
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
64 If the supported colorspace list depends on the file being decoded, list
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
65 the possible out formats (colorspaces) in codecs.conf and implement the
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
66 VDCTRL_QUERY_FORMAT to test the availability of the given colorspace for
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
67 the given video file/stream.
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
68
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
69 The vd.c core will find the best matching colorspace, depending on the
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
70 VFCAP_CSP_SUPPORTED_BY_HW flag (see vfcap.h). If no match can be found,
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
71 it will try again with the 'scale' filter inserted between vd and vo.
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
72 If this is unsuccessful, it will fail :(
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
73
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
74 4. Requesting buffer for the decoded frame:
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
75 The codec has to call mpcodecs_get_image() with proper imgtype & imgflag.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
76 It will find the optimal buffering setup (preferred stride, alignment etc)
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
77 and return a pointer to the allocated and filled up mpi (mp_image_t*) struct.
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
78 The 'imgtype' controls the buffering setup, i.e. STATIC (just one buffer that
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
79 'remembers' its content between frames), TEMP (write-only, full update),
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
80 EXPORT (memory allocation is done by the codec, not recommended) and so on.
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
81 The 'imgflags' set up the limits for the buffer, i.e. stride limitations,
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
82 readability, remembering content etc. See mp_image.h for the short
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
83 description. See dr-methods.txt for the explanation of buffer
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
84 importing and mpi imgtypes.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
85
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
86 Always try to implement stride support! (stride == bytes per line)
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
87 If no stride support, then stride==bytes_per_pixel*image_width.
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
88 If you have stride support in your decoder, use the mpi->stride[] value
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
89 for the byte_per_line for each plane.
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
90 Also take care of other imgflags, like MP_IMGFLAG_PRESERVE and
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
91 MP_IMGFLAG_READABLE, MP_IMGFLAG_COMMON_STRIDE and MP_IMGFLAG_COMMON_PLANE!
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
92 The file mp_image.h contains flag descriptions in comments, read it!
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
93 Ask for help on dev-eng, describing the behavior of your codec, if unsure.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
94
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
95 4.a. buffer allocation, vd.c::mpcodecs_get_image():
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
96 If the requested buffer imgtype!=EXPORT, then vd.c will try to do
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
97 direct rendering, i.e. ask the next filter/vo for the buffer allocation.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
98 It's done by calling get_image() of the vf_XXX.c file.
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
99 If it was successful, the imgflag MP_IMGFLAG_DIRECT will be set, and one
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
100 memcpy() will be saved when passing the data from vd to the next filter/vo.
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
101 See dr-methods.txt for details and examples.
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
102
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
103 5. Decode the frame, to the mpi structure requested in 4., then return the mpi
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
104 to decvideo.c. Return NULL if the decoding failed or skipped the frame.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
105
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
106 6. decvideo.c::decode_video() will now pass the 'mpi' to the next filter (vf_X).
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
107
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
108 7. The filter's (vf_X) put_image() then requests a new mpi buffer by calling
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
109 vf.c::vf_get_image().
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
110
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
111 7.a. vf.c::vf_get_image() will try to get direct rendering by asking the
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
112 next filter to do the buffer allocation (calls vf_Y's get_image()).
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
113 If it fails, it will fall back on normal system memory allocation.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
114
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
115 8. When we're past the whole filter chain (multiple filters can be connected,
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
116 even the same filter multiple times) then the last, 'leaf' filters will be
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
117 called. The only difference between leaf and non-leaf filters is that leaf
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
118 filters have to implement the whole filter API.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
119 Currently leaf filters are: vf_vo.c (wrapper over libvo) and ve_XXX.c
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
120 (video encoders used by MEncoder).
9687
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
121
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
122
9687
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
123 Video Filters
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
124 =============
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
125
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
126 Video filters are plugin-like code modules implementing the interface
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
127 defined in vf.h.
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
128
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
129 Basically it means video output manipulation, i.e. these plugins can
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
130 modify the image and the image properties (size, colorspace, etc) between
9687
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
131 the video decoders (vd.h) and the output layer (libvo or video encoders).
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
132
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
133 The actual API is a mixture of the video decoder (vd.h) and libvo
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
134 (video_out.h) APIs.
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
135
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
136 main differences:
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
137 - vf plugins may be "loaded" multiple times, with different parameters
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
138 and context - it's new in MPlayer, old APIs weren't reentrant.
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
139 - vf plugins don't have to implement all functions - all functions have a
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
140 'fallback' version, so the plugins only override these if wanted.
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
141 - Each vf plugin has its own get_image context, and they can interchange
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
142 images/buffers using these get_image/put_image calls.
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
143
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
144
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
145 The VIDEO FILTER API:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
146 =====================
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
147 filename: vf_FILTERNAME.c
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
148
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
149 vf_info_t* info;
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
150 pointer to the filter description structure:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
151
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
152 const char *info; // description of the filter
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
153 const char *name; // short name of the filter, must be FILTERNAME
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
154 const char *author; // name and email/URL of the author(s)
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
155 const char *comment; // comment, URL to papers describing algorithm etc.
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
156 int (*open)(struct vf_instance *vf,char* args);
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
157 // pointer to the open() function:
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
158
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
159 Sample:
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
160
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
161 vf_info_t vf_info_foobar = {
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
162 "Universal Foo and Bar filter",
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
163 "foobar",
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
164 "Ms. Foo Bar",
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
165 "based on algorithm described at http://www.foo-bar.org",
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
166 open
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
167 };
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
168
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
169 The open() function:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
170
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
171 open() is called when the filter is appended/inserted in the filter chain.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
172 It'll receive the handler (vf) and the optional filter parameters as
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
173 char* string. Note that encoders (ve_*) and vo wrapper (vf_vo.c) have
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
174 non-string arg, but it's specially handled by MPlayer/MEncoder.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
175
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
176 The open() function should fill the vf_instance_t structure with the
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
177 implemented functions' pointers (see below).
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
178 It can optionally allocate memory for its internal data (vf_priv_t) and
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
179 store the pointer in vf->priv.
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
180
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
181 The open() function should parse (or at least check syntax of) parameters,
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
182 and fail (return 0) on error.
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
183
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
184 Sample:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
185
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
186 static int open(vf_instance_t *vf, char* args)
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
187 {
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
188 vf->query_format = query_format;
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
189 vf->config = config;
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
190 vf->put_image = put_image;
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
191 // allocate local storage:
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
192 vf->priv = malloc(sizeof(struct vf_priv_s));
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
193 vf->priv->w =
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
194 vf->priv->h = -1;
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
195 if(args) // parse args:
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
196 if(sscanf(args, "%d:%d", &vf->priv->w, &vf->priv->h)!=2) return 0;
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
197 return 1;
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
198 }
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
199
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
200 Functions in struct vf_instance:
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
201
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
202 NOTE: All these are optional, their function pointer is either NULL or points
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
203 to a default implementation. If you implement them, don't forget to set
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
204 vf->FUNCNAME in your open() !
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
205
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
206 int (*query_format)(struct vf_instance *vf, unsigned int fmt);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
207
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
208 The query_format() function is called one or more times before the config(),
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
209 to find out the capabilities and/or support status of a given colorspace (fmt).
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
210 For the return values, see vfcap.h!
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
211 Normally, a filter should return at least VFCAP_CSP_SUPPORTED for all supported
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
212 colorspaces it accepts as input, and 0 for the unsupported ones.
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
213 If your filter does linear conversion, it should query the next filter,
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
214 and merge in its capability flags. Note: You should always ensure that the
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
215 next filter will accept at least one of your possible output colorspaces!
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
216
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
217 Sample:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
218
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
219 static int query_format(struct vf_instance *vf, unsigned int fmt)
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
220 {
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
221 switch(fmt){
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
222 case IMGFMT_YV12:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
223 case IMGFMT_I420:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
224 case IMGFMT_IYUV:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
225 case IMGFMT_422P:
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
226 return vf_next_query_format(vf,IMGFMT_YUY2) & (~VFCAP_CSP_SUPPORTED_BY_HW);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
227 }
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
228 return 0;
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
229 }
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
230
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
231 For the more complex case, when you have an N -> M colorspace mapping matrix,
31284
c02ae498fb2e remove libmpcodecs/vf_rgb2bgr.c
siretart
parents: 30642
diff changeset
232 see vf_scale or vf_format for examples.
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
233
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
234
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
235 int (*config)(struct vf_instance *vf,
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
236 int width, int height, int d_width, int d_height,
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
237 unsigned int flags, unsigned int outfmt);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
238
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
239 The config() is called to initialize/configure the filter before using it.
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
240 Its parameters are already well-known from libvo:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
241 width, height: size of the coded image
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
242 d_width, d_height: wanted display size (usually aspect corrected w/h)
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
243 Filters should use width, height as input image dimension, but the
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
244 resizing filters (crop, expand, scale, rotate, etc) should update
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
245 d_width/d_height (display size) to preserve the correct aspect ratio!
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
246 Filters should not rely on d_width, d_height as input parameters,
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
247 the only exception is when a filter replaces some libvo functionality
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
248 (like -vf scale with -zoom, or OSD rendering with -vf expand).
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
249 flags: the "good" old libvo flag set:
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
250 0x01 - force fullscreen (-fs)
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
251 0x02 - allow mode switching (-vm)
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
252 0x04 - allow software scaling (-zoom)
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
253 0x08 - flipping (-flip)
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
254 (Usually you don't have to worry about flags, just pass it to next config.)
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
255 outfmt: the selected colorspace/pixelformat. You'll receive images in this
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
256 format.
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
257
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
258 Sample:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
259
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
260 static int config(struct vf_instance *vf,
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
261 int width, int height, int d_width, int d_height,
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
262 unsigned int flags, unsigned int outfmt)
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
263 {
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
264 // use d_width/d_height if not set by the user:
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
265 if (vf->priv->w == -1)
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
266 vf->priv->w = d_width;
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
267 if (vf->priv->h == -1)
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
268 vf->priv->h = d_height;
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
269 // initialize your filter code
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
270 ...
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
271 // OK now config the rest of the filter chain, with our output parameters:
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
272 return vf_next_config(vf,vf->priv->w,vf->priv->h,d_width,d_height,flags,outfmt);
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
273 }
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
274
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
275 void (*uninit)(struct vf_instance *vf);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
276
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
277 Okay, uninit() is the simplest, it's called at the end. You can free your
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
278 private buffers etc here.
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
279
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
280 int (*put_image)(struct vf_instance *vf, mp_image_t *mpi);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
281
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
282 Ah, put_image(). This is the main filter function, it should convert/filter/
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
283 transform the image data from one format/size/color/whatever to another.
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
284 Its input parameter is an mpi (mplayer image) structure, see mp_image.h.
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
285 Your filter has to request a new image buffer for the output, using the
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
286 vf_get_image() function. NOTE: Even if you don't want to modify the image,
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
287 just pass it to the next filter, you have to either
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
288 - not implement put_image() at all - then it will be skipped
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
289 - request a new image with type==EXPORT and copy the pointers
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
290 NEVER pass the mpi as-is, it's local to the filters and may cause trouble.
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
291
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
292 If you completely copy/transform the image, then you probably want this:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
293
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
294 dmpi = vf_get_image(vf->next,mpi->imgfmt, MP_IMGTYPE_TEMP,
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
295 MP_IMGFLAG_ACCEPT_STRIDE, vf->priv->w, vf->priv->h);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
296
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
297 It will allocate a new image and return an mp_image structure filled by
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
298 buffer pointers and stride (bytes per line) values, in size of vf->priv->w
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
299 times vf->priv->h. If your filter cannot handle stride, then leave out
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
300 MP_IMGFLAG_ACCEPT_STRIDE. Note that you can do this, but it isn't recommended,
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
301 the whole video path is designed to use strides to get optimal throughput.
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
302 If your filter allocates output image buffers, then use MP_IMGTYPE_EXPORT
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
303 and fill the returned dmpi's planes[], stride[] with your buffer parameters.
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
304 Note, it is not recommended (no direct rendering), so if you can, use
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
305 vf_get_image() for buffer allocation!
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
306 For other image types and flags see mp_image.h, it has comments.
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
307 If you are unsure, feel free to ask on the dev-eng mailing list. Please
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
308 describe the behavior of your filter, and its limitations, so we can
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
309 suggest the optimal buffer type + flags for your code.
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
310
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
311 Now that you have the input (mpi) and output (dmpi) buffers, you can do
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
312 the conversion. If you didn't notice yet, mp_image has some useful info
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
313 fields. They may help you a lot creating if() or for() structures:
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
314 flags: MP_IMGFLAG_PLANAR, MP_IMGFLAG_YUV, MP_IMGFLAG_SWAPPED
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
315 helps you to handle various pixel formats in single code.
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
316 bpp: bits per pixel
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
317 WARNING! It's number of bits _allocated_ to store a pixel,
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
318 it is not the number of bits actually used to keep colors!
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
319 So it's 16 for both 15 and 16 bit color depth, and is 32 for
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
320 32bpp (actually 24 bit color depth) mode!
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
321 It's 1 for 1bpp, 9 for YVU9, and is 12 for YV12 mode. Get it?
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
322 For planar formats, you also have chroma_width, chroma_height and
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
323 chroma_x_shift, chroma_y_shift too, they specify the chroma subsampling
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
324 for YUV formats:
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
325 chroma_width = luma_width >> chroma_x_shift;
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
326 chroma_height = luma_height >> chroma_y_shift;
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
327
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
328 If you're done, call the rest of the filter chain to process your output
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
329 image:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
330 return vf_next_put_image(vf,dmpi);
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
331
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
332
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
333 Ok, the rest is for advanced functionality only:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
334
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
335 int (*control)(struct vf_instance *vf, int request, void* data);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
336
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
337 You can control the filter at runtime from MPlayer/MEncoder/dec_video:
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
338 #define VFCTRL_QUERY_MAX_PP_LEVEL 4 /* test for postprocessing support (max level) */
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
339 #define VFCTRL_SET_PP_LEVEL 5 /* set postprocessing level */
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
340 #define VFCTRL_SET_EQUALIZER 6 /* set color options (brightness,contrast etc) */
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
341 #define VFCTRL_GET_EQUALIZER 8 /* get color options (brightness,contrast etc) */
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
342 #define VFCTRL_DRAW_OSD 7
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
343 #define VFCTRL_CHANGE_RECTANGLE 9 /* Change the rectangle boundaries */
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
344
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
345
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
346 void (*get_image)(struct vf_instance *vf, mp_image_t *mpi);
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
347
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
348 This is for direct rendering support, works the same way as in libvo drivers.
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
349 It makes in-place pixel modifications possible.
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
350 If you implement it (vf->get_image!=NULL), then it will be called to do the
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
351 buffer allocation. You SHOULD check the buffer restrictions (stride, type,
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
352 readability etc) and if everything is OK, then allocate the requested buffer
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
353 using the vf_get_image() function and copying the buffer pointers.
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
354
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
355 NOTE: You HAVE TO save the dmpi pointer, as you'll need it in put_image()
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
356 later on. It is not guaranteed that you'll get the same mpi for put_image() as
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
357 in get_image() (think of out-of-order decoding, get_image is called in decoding
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
358 order, while put_image is called for display) so the only safe place to save
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
359 it is in the mpi struct itself: mpi->priv=(void*)dmpi;
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
360
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
361
30642
a972c1a4a012 cosmetics: Rename struct vf_instance_s --> vf_instance.
diego
parents: 28269
diff changeset
362 void (*draw_slice)(struct vf_instance *vf, unsigned char** src,
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
363 int* stride, int w,int h, int x, int y);
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
364
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
365 It's the good old draw_slice callback, already known from libvo.
8020
6a11d77bef9a - some explanations suggested by Michael & Rich
arpi
parents: 8001
diff changeset
366 If your filter can operate on partial images, you can implement this one
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
367 to improve performance (cache utilization).
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
368
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
369 Ah, and there are two sets of capability/requirement flags (vfcap.h type)
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
370 in vf_instance_t, used by the default query_format() implementation, and by
8001
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
371 the automatic colorspace/stride matching code (vf_next_config()).
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
372
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
373 // caps:
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
374 unsigned int default_caps; // used by default query_format()
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
375 unsigned int default_reqs; // used by default config()
f02197bd1409 some docs about video filter api
arpi
parents: 7399
diff changeset
376
15624
cf7bbc26cb3d Spelling/wording/grammar fixes, convert mixed tabs and spaces indentation to
diego
parents: 15602
diff changeset
377 BTW, you should avoid using global or static variables to store filter instance
28269
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
378 specific stuff, as filters might be used multiple times and in the future even
49ecb0f6c55f spelling/grammar/wording/whitespace
diego
parents: 28268
diff changeset
379 multiple streams might be possible.
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
380
9687
2e1bd9192ce2 Merged video filter description from vop.txt.
diego
parents: 9644
diff changeset
381
7397
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
382 The AUDIO path:
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
383 ===============
379e379bd4f4 some words and drawing about video path
arpi
parents:
diff changeset
384 TODO!!!