1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2011 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP9_ENCODER_VP9_LOOKAHEAD_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_ENCODER_VP9_LOOKAHEAD_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/yv12config.h" 15*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_encoder.h" 16*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h" 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 19*fb1b10abSAndroid Build Coastguard Worker extern "C" { 20*fb1b10abSAndroid Build Coastguard Worker #endif 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker #define MAX_LAG_BUFFERS 25 23*fb1b10abSAndroid Build Coastguard Worker 24*fb1b10abSAndroid Build Coastguard Worker struct lookahead_entry { 25*fb1b10abSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG img; 26*fb1b10abSAndroid Build Coastguard Worker int64_t ts_start; 27*fb1b10abSAndroid Build Coastguard Worker int64_t ts_end; 28*fb1b10abSAndroid Build Coastguard Worker int show_idx; /*The show_idx of this frame*/ 29*fb1b10abSAndroid Build Coastguard Worker vpx_enc_frame_flags_t flags; 30*fb1b10abSAndroid Build Coastguard Worker }; 31*fb1b10abSAndroid Build Coastguard Worker 32*fb1b10abSAndroid Build Coastguard Worker // The max of past frames we want to keep in the queue. 33*fb1b10abSAndroid Build Coastguard Worker #define MAX_PRE_FRAMES 1 34*fb1b10abSAndroid Build Coastguard Worker 35*fb1b10abSAndroid Build Coastguard Worker struct lookahead_ctx { 36*fb1b10abSAndroid Build Coastguard Worker int max_sz; /* Absolute size of the queue */ 37*fb1b10abSAndroid Build Coastguard Worker int sz; /* Number of buffers currently in the queue */ 38*fb1b10abSAndroid Build Coastguard Worker int read_idx; /* Read index */ 39*fb1b10abSAndroid Build Coastguard Worker int write_idx; /* Write index */ 40*fb1b10abSAndroid Build Coastguard Worker int next_show_idx; /* The show_idx that will be assigned to the next frame 41*fb1b10abSAndroid Build Coastguard Worker being pushed in the queue*/ 42*fb1b10abSAndroid Build Coastguard Worker struct lookahead_entry *buf; /* Buffer list */ 43*fb1b10abSAndroid Build Coastguard Worker }; 44*fb1b10abSAndroid Build Coastguard Worker 45*fb1b10abSAndroid Build Coastguard Worker /**\brief Initializes the lookahead stage 46*fb1b10abSAndroid Build Coastguard Worker * 47*fb1b10abSAndroid Build Coastguard Worker * The lookahead stage is a queue of frame buffers on which some analysis 48*fb1b10abSAndroid Build Coastguard Worker * may be done when buffers are enqueued. 49*fb1b10abSAndroid Build Coastguard Worker */ 50*fb1b10abSAndroid Build Coastguard Worker struct lookahead_ctx *vp9_lookahead_init(unsigned int width, 51*fb1b10abSAndroid Build Coastguard Worker unsigned int height, 52*fb1b10abSAndroid Build Coastguard Worker unsigned int subsampling_x, 53*fb1b10abSAndroid Build Coastguard Worker unsigned int subsampling_y, 54*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH 55*fb1b10abSAndroid Build Coastguard Worker int use_highbitdepth, 56*fb1b10abSAndroid Build Coastguard Worker #endif 57*fb1b10abSAndroid Build Coastguard Worker unsigned int depth); 58*fb1b10abSAndroid Build Coastguard Worker 59*fb1b10abSAndroid Build Coastguard Worker /**\brief Destroys the lookahead stage 60*fb1b10abSAndroid Build Coastguard Worker */ 61*fb1b10abSAndroid Build Coastguard Worker void vp9_lookahead_destroy(struct lookahead_ctx *ctx); 62*fb1b10abSAndroid Build Coastguard Worker 63*fb1b10abSAndroid Build Coastguard Worker /**\brief Check if lookahead is full 64*fb1b10abSAndroid Build Coastguard Worker * 65*fb1b10abSAndroid Build Coastguard Worker * \param[in] ctx Pointer to the lookahead context 66*fb1b10abSAndroid Build Coastguard Worker * 67*fb1b10abSAndroid Build Coastguard Worker * Return 1 if lookahead is full, otherwise return 0. 68*fb1b10abSAndroid Build Coastguard Worker */ 69*fb1b10abSAndroid Build Coastguard Worker int vp9_lookahead_full(const struct lookahead_ctx *ctx); 70*fb1b10abSAndroid Build Coastguard Worker 71*fb1b10abSAndroid Build Coastguard Worker /**\brief Return the next_show_idx 72*fb1b10abSAndroid Build Coastguard Worker * 73*fb1b10abSAndroid Build Coastguard Worker * \param[in] ctx Pointer to the lookahead context 74*fb1b10abSAndroid Build Coastguard Worker * 75*fb1b10abSAndroid Build Coastguard Worker * Return the show_idx that will be assigned to the next 76*fb1b10abSAndroid Build Coastguard Worker * frame pushed by vp9_lookahead_push() 77*fb1b10abSAndroid Build Coastguard Worker */ 78*fb1b10abSAndroid Build Coastguard Worker int vp9_lookahead_next_show_idx(const struct lookahead_ctx *ctx); 79*fb1b10abSAndroid Build Coastguard Worker 80*fb1b10abSAndroid Build Coastguard Worker /**\brief Enqueue a source buffer 81*fb1b10abSAndroid Build Coastguard Worker * 82*fb1b10abSAndroid Build Coastguard Worker * This function will copy the source image into a new framebuffer with 83*fb1b10abSAndroid Build Coastguard Worker * the expected stride/border. 84*fb1b10abSAndroid Build Coastguard Worker * 85*fb1b10abSAndroid Build Coastguard Worker * \param[in] ctx Pointer to the lookahead context 86*fb1b10abSAndroid Build Coastguard Worker * \param[in] src Pointer to the image to enqueue 87*fb1b10abSAndroid Build Coastguard Worker * \param[in] ts_start Timestamp for the start of this frame 88*fb1b10abSAndroid Build Coastguard Worker * \param[in] ts_end Timestamp for the end of this frame 89*fb1b10abSAndroid Build Coastguard Worker * \param[in] flags Flags set on this frame 90*fb1b10abSAndroid Build Coastguard Worker */ 91*fb1b10abSAndroid Build Coastguard Worker int vp9_lookahead_push(struct lookahead_ctx *ctx, YV12_BUFFER_CONFIG *src, 92*fb1b10abSAndroid Build Coastguard Worker int64_t ts_start, int64_t ts_end, int use_highbitdepth, 93*fb1b10abSAndroid Build Coastguard Worker vpx_enc_frame_flags_t flags); 94*fb1b10abSAndroid Build Coastguard Worker 95*fb1b10abSAndroid Build Coastguard Worker /**\brief Get the next source buffer to encode 96*fb1b10abSAndroid Build Coastguard Worker * 97*fb1b10abSAndroid Build Coastguard Worker * 98*fb1b10abSAndroid Build Coastguard Worker * \param[in] ctx Pointer to the lookahead context 99*fb1b10abSAndroid Build Coastguard Worker * \param[in] drain Flag indicating the buffer should be drained 100*fb1b10abSAndroid Build Coastguard Worker * (return a buffer regardless of the current queue depth) 101*fb1b10abSAndroid Build Coastguard Worker * 102*fb1b10abSAndroid Build Coastguard Worker * \retval NULL, if drain set and queue is empty 103*fb1b10abSAndroid Build Coastguard Worker * \retval NULL, if drain not set and queue not of the configured depth 104*fb1b10abSAndroid Build Coastguard Worker */ 105*fb1b10abSAndroid Build Coastguard Worker struct lookahead_entry *vp9_lookahead_pop(struct lookahead_ctx *ctx, int drain); 106*fb1b10abSAndroid Build Coastguard Worker 107*fb1b10abSAndroid Build Coastguard Worker /**\brief Get a future source buffer to encode 108*fb1b10abSAndroid Build Coastguard Worker * 109*fb1b10abSAndroid Build Coastguard Worker * \param[in] ctx Pointer to the lookahead context 110*fb1b10abSAndroid Build Coastguard Worker * \param[in] index Index of the frame to be returned, 0 == next frame 111*fb1b10abSAndroid Build Coastguard Worker * 112*fb1b10abSAndroid Build Coastguard Worker * \retval NULL, if no buffer exists at the specified index 113*fb1b10abSAndroid Build Coastguard Worker */ 114*fb1b10abSAndroid Build Coastguard Worker struct lookahead_entry *vp9_lookahead_peek(struct lookahead_ctx *ctx, 115*fb1b10abSAndroid Build Coastguard Worker int index); 116*fb1b10abSAndroid Build Coastguard Worker 117*fb1b10abSAndroid Build Coastguard Worker /**\brief Get the number of frames currently in the lookahead queue 118*fb1b10abSAndroid Build Coastguard Worker * 119*fb1b10abSAndroid Build Coastguard Worker * \param[in] ctx Pointer to the lookahead context 120*fb1b10abSAndroid Build Coastguard Worker */ 121*fb1b10abSAndroid Build Coastguard Worker unsigned int vp9_lookahead_depth(struct lookahead_ctx *ctx); 122*fb1b10abSAndroid Build Coastguard Worker 123*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 124*fb1b10abSAndroid Build Coastguard Worker } // extern "C" 125*fb1b10abSAndroid Build Coastguard Worker #endif 126*fb1b10abSAndroid Build Coastguard Worker 127*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP9_ENCODER_VP9_LOOKAHEAD_H_ 128