1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
|
The documentation is currently a mess. Sorry about that, hope to write
something better for the 0.4.1 release.
For people migrating code from 0.3.x to 0.4.0, the biggest thing to
note is that mpeg2_parse now returns a new state STATE_BUFFER when it
needs more data. Version 0.3.x used to return a -1 constant for this -
please update your code to replace that -1 with STATE_BUFFER. Otherwise
0.3.x code should mostly work with 0.4.0, hopefully.
For people new to libmpeg2, it's best to start by looking at
doc/sample1 and doc/sample2, which decode an mpeg2 elementary stream
and output their individual pictures as yuv frames (sample1) or rgb
frames (sample2). The main loop calls mpeg2_parse() which does some
work and then returns a state indicating what it just did -
STATE_BUFFER if it reached the end of the buffer and it needs a new
one, STATE_SEQUENCE if it just parsed a sequence header, STATE_PICTURE
if it just parsed a picture header, STATE_SLICE if it just decoded the
slice information associated with a picture (now is a good time to
save that decoded picture), etc...
To make more complex buffer management (basically allocate your own
buffers instead of letting the lib do it for you), look at
sample3/sample4 (giving your buffers to the lib at init time but
letting the lib chose a buffer for each picture) or sample5/sample6
(giving a new buffer to the lib for each picture).
Color conversion has been moved to a new helper library, libmpeg2convert.
The details of the mpeg2_convert_t type might change in the future,
but what won't change is that you should just take one of the
mpeg2_convert_t symbols exported from libmpeg2convert, and pass it to
the mpeg2_convert() function, and voila, you now get your output
buffers in the desired format. For example if you want rgb 32-bit
samples, you just call mpeg2_convert (mpeg2dec, mpeg2convert_rgb32, NULL)
and that's it.
There is a new mpeg2_stride function too. By default libmpeg2 choses
the smallest stride that will work for a given picture size, if you
want a larger stride you can set it (after the sequence header has
been decoded) by calling mpeg2_stride.
There is also a new function mpeg2_reset which should hopefully do the
right thing after skipping to a new position in the mpeg2 stream. If
full_reset is zero the lib starts decoding at the next picture, if
it's one the lib starts looking for the next sequence header.
The mpeg2_pts function is gone, because people complained about not
being to pass a 33-bit PTS thru it. So instead it's been replaced with
mpeg2_tag_picture(), which is identical except that it allows you to
pass two 32-bit values. You can use them to form a combined 64-bit
time stamp, or two 32-bit PTS/DTS stamps, or whatever you please -
libmpeg2 never uses these values, it just passes them around, hence
the name "tag". The semantics are what you want for a PTS function
though, i.e. the tags get associated to the next picture that starts
after the tag was set, where the start of a picture is defined as the
first byte of its picture start code.
That's all I can think of - sorry for the lack of proper
documentation, I'll try to help this before the 0.4.1 release.
I - simplest example
explanation of sequence_t, picture_t fields
II - w/ color conversion
III - pts
IV - app that preallocates buffers
V - app that does its own buffer management
Quick-and-dirty documentation for libmpeg2 0.3.1
Kees Cook <mpeg2@outflux.net>
2003-04-25
Basic Usage Pseudocode
----------------------
if (you need a certain acceleration)
mpeg2_accel(desired_acceleration);
handle=mpeg2_init();
info=mpeg2_info(handle);
while (data_available) {
state=mpeg2_parse(handle);
switch (state) {
case STATE_BUFFER:
read some data
mpeg2_buffer(handle,data_start,data_end);
break;
case STATE_SLICE:
case STATE_END:
display the frame described in "info"
break;
case STATE_INVALID:
abort
break;
}
}
mpeg2_close(handle);
Basic Usage Explained
---------------------
libmpeg2 uses an opaque pointer which is the active "handle" to the mpeg2
decoder. To get this handle (of type "mpeg2dec_t"), call "mpeg2_init()".
Data is loaded into the decoder with "mpeg2_buffer" whenever
"mpeg2_parse" is ready for more data (return state is STATE_BUFFER).
Pictures are available whenever "mpeg2_parse"'s return state is
STATE_SLICE or STATE_END.
This means the *previous* picture is available, right? In other
words, when STATE_SLICE is seen, that means that the *previous*
picture is all done. Same thing for STATE_END. So if you want to
see one frame at a time (without starting to fill the mpeg2 decoder
with more data not from that picture) we'd have to inject something
to make it report STATE_END?
Basic Function Reference
------------------------
mpeg2dec_t * mpeg2_init()
Initializes a memory space for mpeg2 decoding. This memory must
be freed with a call to "mpeg2_close" when finished.
Returns NULL on error (when system is out of memory)
- Doesn't check if chunk_buffer is NULL?
uint32_t mpeg2_accel(uint32_t accel)
Sets the CPU acceleration type to be used for all decoders for the
life of the program. YOU CAN SAFELY IGNORE THIS FUNCTION.
By default, a call to mpeg2_accel is not needed, since the best
available acceleration will be auto-detected. To override the
default, this function must be called before any calls to
"mpeg2_init". See mpeg2.h for a list of the available accelerations
(prefix "MPEG2_ACCEL_...").
After a call to mpeg2_init, mpeg2_accel can be called to find out
what the selected acceleration list is. Once the accelerations have
been selected (through explicitly requesting one, or through
auto-detection) the "accel" parameter will be ignored.
Returns selected acceleration list. If the requested acceleration
is not available, the function will auto-detect the best available
accelerations and return that instead.
- Cannot be undone! This should maybe be a part of
the mpeg2 structure somehow?
const mpeg2_info_t * mpeg2_info(mpeg2dec_t * handle)
Gets structure for the mpeg2 decoder's "mpeg2_info_t" structure.
This will let you do something (like display!) the decoded pictures
with the mpeg2_info_t structure members:
display_fbuf:
memory area containing the rendered picture information.
If this is NULL, no frame is available.
display_fbuf->buf:
YUV coded pixel data for the picture.
display_picture:
data structure describing the current picture.
see mpeg2.h for more details.
sequence:
data structure describing the entire current picture sequence:
width: picture width in pixels.
height: picture height in pixels.
see mpeg2.h for more details.
user_data:
handy place to attach things needed by your program. Must
be detached before calling "mpeg2_close".
there are more...check mpeg2.h
int mpeg2_parse(mpeg2dec_t * handle)
Parses available data and returns state of the decoder:
STATE_BUFFER:
ready for more data. decoder has finished reading
the buffer sent with mpeg2_buffer.
STATE_SEQUENCE:
A sequence header has been found.
STATE_SEQUENCE_REPEATED:
A repeated sequence header has been found and processed.
STATE_GOP:
A GOP has been found.
STATE_PICTURE:
A picture header has been found.
STATE_PICTURE_2ND:
A second field picture header has been found.
STATE_SLICE_1ST:
First slice of a multi-field picture has been found.
STATE_SLICE:
Final slice (multi-field or not) of a picture has been found.
Good time to update the display.
STATE_END:
End of the stream? Good time to update the display.
STATE_INVALID:
Filled the internal buffers without finding any start codes.
Cannot continue: mpeg2_close must be called next.
void mpeg2_buffer(mpeg2dec_t * handle, uint8_t * start, uint8_t * end)
Makes data between "start" and "end" available for processing.
If a subsequent call to "mpeg2_parse" doesn't find anything useful
(returns STATE_BUFFER) then this data will be copied into the mpeg2
decoder's private data area. This process repeats until something
useful is found with mpeg2_parse (returns something other than
STATE_BUFFER), or the buffer fills up.
void mpeg2_close(mpeg2dec_t * handle)
Cleans up the memory associated with the mpeg2 decoder handle.
- does not check for NULL frees! (via mpeg2_free)
Advanced Function Reference
---------------------------
mpeg2_convert
mpeg2_set_buf
mpeg2_custom_fbuf
mpeg2_init_fbuf
mpeg2_slice
|