Andreas Huber | 90d3ed9 | 2010-05-25 11:35:35 -0700 | [diff] [blame] | 1 | /*! \page usage_decode Decoding |
| 2 | |
| 3 | The vpx_codec_decode() function is at the core of the decode loop. It |
| 4 | processes packets of compressed data passed by the application, producing |
| 5 | decoded images. The decoder expects packets to comprise exactly one image |
| 6 | frame of data. Packets \ref MUST be passed in decode order. If the |
| 7 | application wishes to associate some data with the frame, the |
| 8 | <code>user_priv</code> member may be set. The <code>deadline</code> |
| 9 | parameter controls the amount of time in microseconds the decoder should |
| 10 | spend working on the frame. This is typically used to support adaptive |
| 11 | \ref usage_postproc based on the amount of free CPU time. For more |
| 12 | information on the <code>deadline</code> parameter, see \ref usage_deadline. |
| 13 | |
| 14 | \ref samples |
| 15 | |
| 16 | |
| 17 | \section usage_cb Callback Based Decoding |
| 18 | There are two methods for the application to access decoded frame data. Some |
| 19 | codecs support asynchronous (callback-based) decoding \ref usage_features |
| 20 | that allow the application to register a callback to be invoked by the |
| 21 | decoder when decoded data becomes available. Decoders are not required to |
| 22 | support this feature, however. Like all \ref usage_features, support can be |
| 23 | determined by calling vpx_codec_get_caps(). Callbacks are available in both |
| 24 | frame-based and slice-based variants. Frame based callbacks conform to the |
| 25 | signature of #vpx_codec_put_frame_cb_fn_t and are invoked once the entire |
| 26 | frame has been decoded. Slice based callbacks conform to the signature of |
| 27 | #vpx_codec_put_slice_cb_fn_t and are invoked after a subsection of the frame |
| 28 | is decoded. For example, a slice callback could be issued for each |
| 29 | macroblock row. However, the number and size of slices to return is |
| 30 | implementation specific. Also, the image data passed in a slice callback is |
| 31 | not necessarily in the same memory segment as the data will be when it is |
| 32 | assembled into a full frame. For this reason, the application \ref MUST |
| 33 | examine the rectangles that describe what data is valid to access and what |
| 34 | data has been updated in this call. For all their additional complexity, |
| 35 | slice based decoding callbacks provide substantial speed gains to the |
| 36 | overall application in some cases, due to improved cache behavior. |
| 37 | |
| 38 | |
| 39 | \section usage_frame_iter Frame Iterator Based Decoding |
| 40 | If the codec does not support callback based decoding, or the application |
| 41 | chooses not to make use of that feature, decoded frames are made available |
| 42 | through the vpx_codec_get_frame() iterator. The application initializes the |
| 43 | iterator storage (of type #vpx_codec_iter_t) to NULL, then calls |
| 44 | vpx_codec_get_frame repeatedly until it returns NULL, indicating that all |
| 45 | images have been returned. This process may result in zero, one, or many |
| 46 | frames that are ready for display, depending on the codec. |
| 47 | |
| 48 | |
| 49 | \section usage_postproc Postprocessing |
| 50 | Postprocessing is a process that is applied after a frame is decoded to |
| 51 | enhance the image's appearance by removing artifacts introduced in the |
| 52 | compression process. It is not required to properly decode the frame, and |
| 53 | is generally done only when there is enough spare CPU time to execute |
| 54 | the required filters. Codecs may support a number of different |
| 55 | postprocessing filters, and the available filters may differ from platform |
| 56 | to platform. Embedded devices often do not have enough CPU to implement |
| 57 | postprocessing in software. The filter selection is generally handled |
| 58 | automatically by the codec, depending on the amount of time remaining before |
| 59 | hitting the user-specified \ref usage_deadline after decoding the frame. |
| 60 | |
| 61 | |
| 62 | */ |