1 /*
2  *  Copyright (c) 2011 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 #ifndef VP8_ENCODER_LOOKAHEAD_H_
11 #define VP8_ENCODER_LOOKAHEAD_H_
12 #include "vpx_scale/yv12config.h"
13 #include "vpx/vpx_integer.h"
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 struct lookahead_entry
20 {
21     YV12_BUFFER_CONFIG  img;
22     int64_t             ts_start;
23     int64_t             ts_end;
24     unsigned int        flags;
25 };
26 
27 
28 struct lookahead_ctx;
29 
30 /**\brief Initializes the lookahead stage
31  *
32  * The lookahead stage is a queue of frame buffers on which some analysis
33  * may be done when buffers are enqueued.
34  *
35  *
36  */
37 struct lookahead_ctx* vp8_lookahead_init(unsigned int width,
38                                          unsigned int height,
39                                          unsigned int depth
40                                          );
41 
42 
43 /**\brief Destroys the lookahead stage
44  *
45  */
46 void vp8_lookahead_destroy(struct lookahead_ctx *ctx);
47 
48 
49 /**\brief Enqueue a source buffer
50  *
51  * This function will copy the source image into a new framebuffer with
52  * the expected stride/border.
53  *
54  * If active_map is non-NULL and there is only one frame in the queue, then copy
55  * only active macroblocks.
56  *
57  * \param[in] ctx         Pointer to the lookahead context
58  * \param[in] src         Pointer to the image to enqueue
59  * \param[in] ts_start    Timestamp for the start of this frame
60  * \param[in] ts_end      Timestamp for the end of this frame
61  * \param[in] flags       Flags set on this frame
62  * \param[in] active_map  Map that specifies which macroblock is active
63  */
64 int
65 vp8_lookahead_push(struct lookahead_ctx *ctx,
66                    YV12_BUFFER_CONFIG   *src,
67                    int64_t               ts_start,
68                    int64_t               ts_end,
69                    unsigned int          flags,
70                    unsigned char        *active_map);
71 
72 
73 /**\brief Get the next source buffer to encode
74  *
75  *
76  * \param[in] ctx       Pointer to the lookahead context
77  * \param[in] drain     Flag indicating the buffer should be drained
78  *                      (return a buffer regardless of the current queue depth)
79  *
80  * \retval NULL, if drain set and queue is empty
81  * \retval NULL, if drain not set and queue not of the configured depth
82  *
83  */
84 struct lookahead_entry*
85 vp8_lookahead_pop(struct lookahead_ctx *ctx,
86                   int                   drain);
87 
88 
89 #define PEEK_FORWARD   1
90 #define PEEK_BACKWARD -1
91 /**\brief Get a future source buffer to encode
92  *
93  * \param[in] ctx       Pointer to the lookahead context
94  * \param[in] index     Index of the frame to be returned, 0 == next frame
95  *
96  * \retval NULL, if no buffer exists at the specified index
97  *
98  */
99 struct lookahead_entry*
100 vp8_lookahead_peek(struct lookahead_ctx *ctx,
101                    unsigned int          index,
102                    int                   direction);
103 
104 
105 /**\brief Get the number of frames currently in the lookahead queue
106  *
107  * \param[in] ctx       Pointer to the lookahead context
108  */
109 unsigned int
110 vp8_lookahead_depth(struct lookahead_ctx *ctx);
111 
112 
113 #ifdef __cplusplus
114 }  // extern "C"
115 #endif
116 
117 #endif  // VP8_ENCODER_LOOKAHEAD_H_
118