annotate DOCS/tech/libmpcodecs.txt @ 31794:543698dab5d2

Properly close file on error or uninit. Avoids failing with "device busy" e.g. when reinitializing the ao. Fixes bug #1746.
author reimar
date Fri, 30 Jul 2010 18:28:02 +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!!!