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