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 
11 #ifndef VP9_ENCODER_VP9_LOOKAHEAD_H_
12 #define VP9_ENCODER_VP9_LOOKAHEAD_H_
13 
14 #include "vpx_scale/yv12config.h"
15 #include "vpx/vpx_integer.h"
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 #define MAX_LAG_BUFFERS 25
22 
23 // The max of past frames we want to keep in the queue.
24 #define MAX_PRE_FRAMES 1
25 
26 struct lookahead_entry {
27   YV12_BUFFER_CONFIG  img;
28   int64_t             ts_start;
29   int64_t             ts_end;
30   unsigned int        flags;
31 };
32 
33 
34 struct lookahead_ctx;
35 
36 /**\brief Initializes the lookahead stage
37  *
38  * The lookahead stage is a queue of frame buffers on which some analysis
39  * may be done when buffers are enqueued.
40  */
41 struct lookahead_ctx *vp9_lookahead_init(unsigned int width,
42                                          unsigned int height,
43                                          unsigned int subsampling_x,
44                                          unsigned int subsampling_y,
45                                          unsigned int depth);
46 
47 
48 /**\brief Destroys the lookahead stage
49  */
50 void vp9_lookahead_destroy(struct lookahead_ctx *ctx);
51 
52 
53 /**\brief Enqueue a source buffer
54  *
55  * This function will copy the source image into a new framebuffer with
56  * the expected stride/border.
57  *
58  * If active_map is non-NULL and there is only one frame in the queue, then copy
59  * only active macroblocks.
60  *
61  * \param[in] ctx         Pointer to the lookahead context
62  * \param[in] src         Pointer to the image to enqueue
63  * \param[in] ts_start    Timestamp for the start of this frame
64  * \param[in] ts_end      Timestamp for the end of this frame
65  * \param[in] flags       Flags set on this frame
66  * \param[in] active_map  Map that specifies which macroblock is active
67  */
68 int vp9_lookahead_push(struct lookahead_ctx *ctx, YV12_BUFFER_CONFIG *src,
69                        int64_t ts_start, int64_t ts_end, unsigned int flags);
70 
71 
72 /**\brief Get the next source buffer to encode
73  *
74  *
75  * \param[in] ctx       Pointer to the lookahead context
76  * \param[in] drain     Flag indicating the buffer should be drained
77  *                      (return a buffer regardless of the current queue depth)
78  *
79  * \retval NULL, if drain set and queue is empty
80  * \retval NULL, if drain not set and queue not of the configured depth
81  */
82 struct lookahead_entry *vp9_lookahead_pop(struct lookahead_ctx *ctx,
83                                           int drain);
84 
85 
86 /**\brief Get a future source buffer to encode
87  *
88  * \param[in] ctx       Pointer to the lookahead context
89  * \param[in] index     Index of the frame to be returned, 0 == next frame
90  *
91  * \retval NULL, if no buffer exists at the specified index
92  */
93 struct lookahead_entry *vp9_lookahead_peek(struct lookahead_ctx *ctx,
94                                            int index);
95 
96 
97 /**\brief Get the number of frames currently in the lookahead queue
98  *
99  * \param[in] ctx       Pointer to the lookahead context
100  */
101 unsigned int vp9_lookahead_depth(struct lookahead_ctx *ctx);
102 
103 #ifdef __cplusplus
104 }  // extern "C"
105 #endif
106 
107 #endif  // VP9_ENCODER_VP9_LOOKAHEAD_H_
108