1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 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 #include "vpx_config.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp_rtcd.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vp8_rtcd.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/postproc.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/system_state.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale_rtcd.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/yv12config.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "postproc.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "common.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/vpx_scale.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "systemdependent.h"
22*fb1b10abSAndroid Build Coastguard Worker
23*fb1b10abSAndroid Build Coastguard Worker #include <limits.h>
24*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
25*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
26*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
27*fb1b10abSAndroid Build Coastguard Worker
28*fb1b10abSAndroid Build Coastguard Worker /* clang-format off */
29*fb1b10abSAndroid Build Coastguard Worker #define RGB_TO_YUV(t) \
30*fb1b10abSAndroid Build Coastguard Worker (unsigned char)((0.257 * (float)(t >> 16)) + \
31*fb1b10abSAndroid Build Coastguard Worker (0.504 * (float)(t >> 8 & 0xff)) + \
32*fb1b10abSAndroid Build Coastguard Worker (0.098 * (float)(t & 0xff)) + 16), \
33*fb1b10abSAndroid Build Coastguard Worker (unsigned char)(-(0.148 * (float)(t >> 16)) - \
34*fb1b10abSAndroid Build Coastguard Worker (0.291 * (float)(t >> 8 & 0xff)) + \
35*fb1b10abSAndroid Build Coastguard Worker (0.439 * (float)(t & 0xff)) + 128), \
36*fb1b10abSAndroid Build Coastguard Worker (unsigned char)((0.439 * (float)(t >> 16)) - \
37*fb1b10abSAndroid Build Coastguard Worker (0.368 * (float)(t >> 8 & 0xff)) - \
38*fb1b10abSAndroid Build Coastguard Worker (0.071 * (float)(t & 0xff)) + 128)
39*fb1b10abSAndroid Build Coastguard Worker /* clang-format on */
40*fb1b10abSAndroid Build Coastguard Worker
41*fb1b10abSAndroid Build Coastguard Worker extern void vp8_blit_text(const char *msg, unsigned char *address,
42*fb1b10abSAndroid Build Coastguard Worker const int pitch);
43*fb1b10abSAndroid Build Coastguard Worker extern void vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image,
44*fb1b10abSAndroid Build Coastguard Worker const int pitch);
45*fb1b10abSAndroid Build Coastguard Worker /***********************************************************************************************************
46*fb1b10abSAndroid Build Coastguard Worker */
47*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_POSTPROC
q2mbl(int x)48*fb1b10abSAndroid Build Coastguard Worker static int q2mbl(int x) {
49*fb1b10abSAndroid Build Coastguard Worker if (x < 20) x = 20;
50*fb1b10abSAndroid Build Coastguard Worker
51*fb1b10abSAndroid Build Coastguard Worker x = 50 + (x - 50) * 10 / 8;
52*fb1b10abSAndroid Build Coastguard Worker return x * x / 3;
53*fb1b10abSAndroid Build Coastguard Worker }
54*fb1b10abSAndroid Build Coastguard Worker
vp8_de_mblock(YV12_BUFFER_CONFIG * post,int q)55*fb1b10abSAndroid Build Coastguard Worker static void vp8_de_mblock(YV12_BUFFER_CONFIG *post, int q) {
56*fb1b10abSAndroid Build Coastguard Worker vpx_mbpost_proc_across_ip(post->y_buffer, post->y_stride, post->y_height,
57*fb1b10abSAndroid Build Coastguard Worker post->y_width, q2mbl(q));
58*fb1b10abSAndroid Build Coastguard Worker vpx_mbpost_proc_down(post->y_buffer, post->y_stride, post->y_height,
59*fb1b10abSAndroid Build Coastguard Worker post->y_width, q2mbl(q));
60*fb1b10abSAndroid Build Coastguard Worker }
61*fb1b10abSAndroid Build Coastguard Worker
vp8_deblock(VP8_COMMON * cm,YV12_BUFFER_CONFIG * source,YV12_BUFFER_CONFIG * post,int q)62*fb1b10abSAndroid Build Coastguard Worker void vp8_deblock(VP8_COMMON *cm, YV12_BUFFER_CONFIG *source,
63*fb1b10abSAndroid Build Coastguard Worker YV12_BUFFER_CONFIG *post, int q) {
64*fb1b10abSAndroid Build Coastguard Worker double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
65*fb1b10abSAndroid Build Coastguard Worker int ppl = (int)(level + .5);
66*fb1b10abSAndroid Build Coastguard Worker
67*fb1b10abSAndroid Build Coastguard Worker const MODE_INFO *mode_info_context = cm->mi;
68*fb1b10abSAndroid Build Coastguard Worker int mbr, mbc;
69*fb1b10abSAndroid Build Coastguard Worker
70*fb1b10abSAndroid Build Coastguard Worker /* The pixel thresholds are adjusted according to if or not the macroblock
71*fb1b10abSAndroid Build Coastguard Worker * is a skipped block. */
72*fb1b10abSAndroid Build Coastguard Worker unsigned char *ylimits = cm->pp_limits_buffer;
73*fb1b10abSAndroid Build Coastguard Worker unsigned char *uvlimits = cm->pp_limits_buffer + 16 * cm->mb_cols;
74*fb1b10abSAndroid Build Coastguard Worker
75*fb1b10abSAndroid Build Coastguard Worker if (ppl > 0) {
76*fb1b10abSAndroid Build Coastguard Worker for (mbr = 0; mbr < cm->mb_rows; ++mbr) {
77*fb1b10abSAndroid Build Coastguard Worker unsigned char *ylptr = ylimits;
78*fb1b10abSAndroid Build Coastguard Worker unsigned char *uvlptr = uvlimits;
79*fb1b10abSAndroid Build Coastguard Worker for (mbc = 0; mbc < cm->mb_cols; ++mbc) {
80*fb1b10abSAndroid Build Coastguard Worker unsigned char mb_ppl;
81*fb1b10abSAndroid Build Coastguard Worker
82*fb1b10abSAndroid Build Coastguard Worker if (mode_info_context->mbmi.mb_skip_coeff) {
83*fb1b10abSAndroid Build Coastguard Worker mb_ppl = (unsigned char)ppl >> 1;
84*fb1b10abSAndroid Build Coastguard Worker } else {
85*fb1b10abSAndroid Build Coastguard Worker mb_ppl = (unsigned char)ppl;
86*fb1b10abSAndroid Build Coastguard Worker }
87*fb1b10abSAndroid Build Coastguard Worker
88*fb1b10abSAndroid Build Coastguard Worker memset(ylptr, mb_ppl, 16);
89*fb1b10abSAndroid Build Coastguard Worker memset(uvlptr, mb_ppl, 8);
90*fb1b10abSAndroid Build Coastguard Worker
91*fb1b10abSAndroid Build Coastguard Worker ylptr += 16;
92*fb1b10abSAndroid Build Coastguard Worker uvlptr += 8;
93*fb1b10abSAndroid Build Coastguard Worker mode_info_context++;
94*fb1b10abSAndroid Build Coastguard Worker }
95*fb1b10abSAndroid Build Coastguard Worker mode_info_context++;
96*fb1b10abSAndroid Build Coastguard Worker
97*fb1b10abSAndroid Build Coastguard Worker vpx_post_proc_down_and_across_mb_row(
98*fb1b10abSAndroid Build Coastguard Worker source->y_buffer + 16 * mbr * source->y_stride,
99*fb1b10abSAndroid Build Coastguard Worker post->y_buffer + 16 * mbr * post->y_stride, source->y_stride,
100*fb1b10abSAndroid Build Coastguard Worker post->y_stride, source->y_width, ylimits, 16);
101*fb1b10abSAndroid Build Coastguard Worker
102*fb1b10abSAndroid Build Coastguard Worker vpx_post_proc_down_and_across_mb_row(
103*fb1b10abSAndroid Build Coastguard Worker source->u_buffer + 8 * mbr * source->uv_stride,
104*fb1b10abSAndroid Build Coastguard Worker post->u_buffer + 8 * mbr * post->uv_stride, source->uv_stride,
105*fb1b10abSAndroid Build Coastguard Worker post->uv_stride, source->uv_width, uvlimits, 8);
106*fb1b10abSAndroid Build Coastguard Worker vpx_post_proc_down_and_across_mb_row(
107*fb1b10abSAndroid Build Coastguard Worker source->v_buffer + 8 * mbr * source->uv_stride,
108*fb1b10abSAndroid Build Coastguard Worker post->v_buffer + 8 * mbr * post->uv_stride, source->uv_stride,
109*fb1b10abSAndroid Build Coastguard Worker post->uv_stride, source->uv_width, uvlimits, 8);
110*fb1b10abSAndroid Build Coastguard Worker }
111*fb1b10abSAndroid Build Coastguard Worker } else {
112*fb1b10abSAndroid Build Coastguard Worker vp8_yv12_copy_frame(source, post);
113*fb1b10abSAndroid Build Coastguard Worker }
114*fb1b10abSAndroid Build Coastguard Worker }
115*fb1b10abSAndroid Build Coastguard Worker
vp8_de_noise(VP8_COMMON * cm,YV12_BUFFER_CONFIG * source,int q,int uvfilter)116*fb1b10abSAndroid Build Coastguard Worker void vp8_de_noise(VP8_COMMON *cm, YV12_BUFFER_CONFIG *source, int q,
117*fb1b10abSAndroid Build Coastguard Worker int uvfilter) {
118*fb1b10abSAndroid Build Coastguard Worker int mbr;
119*fb1b10abSAndroid Build Coastguard Worker double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065;
120*fb1b10abSAndroid Build Coastguard Worker int ppl = (int)(level + .5);
121*fb1b10abSAndroid Build Coastguard Worker int mb_rows = cm->mb_rows;
122*fb1b10abSAndroid Build Coastguard Worker int mb_cols = cm->mb_cols;
123*fb1b10abSAndroid Build Coastguard Worker unsigned char *limits = cm->pp_limits_buffer;
124*fb1b10abSAndroid Build Coastguard Worker
125*fb1b10abSAndroid Build Coastguard Worker memset(limits, (unsigned char)ppl, 16 * mb_cols);
126*fb1b10abSAndroid Build Coastguard Worker
127*fb1b10abSAndroid Build Coastguard Worker /* TODO: The original code don't filter the 2 outer rows and columns. */
128*fb1b10abSAndroid Build Coastguard Worker for (mbr = 0; mbr < mb_rows; ++mbr) {
129*fb1b10abSAndroid Build Coastguard Worker vpx_post_proc_down_and_across_mb_row(
130*fb1b10abSAndroid Build Coastguard Worker source->y_buffer + 16 * mbr * source->y_stride,
131*fb1b10abSAndroid Build Coastguard Worker source->y_buffer + 16 * mbr * source->y_stride, source->y_stride,
132*fb1b10abSAndroid Build Coastguard Worker source->y_stride, source->y_width, limits, 16);
133*fb1b10abSAndroid Build Coastguard Worker if (uvfilter == 1) {
134*fb1b10abSAndroid Build Coastguard Worker vpx_post_proc_down_and_across_mb_row(
135*fb1b10abSAndroid Build Coastguard Worker source->u_buffer + 8 * mbr * source->uv_stride,
136*fb1b10abSAndroid Build Coastguard Worker source->u_buffer + 8 * mbr * source->uv_stride, source->uv_stride,
137*fb1b10abSAndroid Build Coastguard Worker source->uv_stride, source->uv_width, limits, 8);
138*fb1b10abSAndroid Build Coastguard Worker vpx_post_proc_down_and_across_mb_row(
139*fb1b10abSAndroid Build Coastguard Worker source->v_buffer + 8 * mbr * source->uv_stride,
140*fb1b10abSAndroid Build Coastguard Worker source->v_buffer + 8 * mbr * source->uv_stride, source->uv_stride,
141*fb1b10abSAndroid Build Coastguard Worker source->uv_stride, source->uv_width, limits, 8);
142*fb1b10abSAndroid Build Coastguard Worker }
143*fb1b10abSAndroid Build Coastguard Worker }
144*fb1b10abSAndroid Build Coastguard Worker }
145*fb1b10abSAndroid Build Coastguard Worker #endif // CONFIG_POSTPROC
146*fb1b10abSAndroid Build Coastguard Worker
147*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_POSTPROC
vp8_post_proc_frame(VP8_COMMON * oci,YV12_BUFFER_CONFIG * dest,vp8_ppflags_t * ppflags)148*fb1b10abSAndroid Build Coastguard Worker int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest,
149*fb1b10abSAndroid Build Coastguard Worker vp8_ppflags_t *ppflags) {
150*fb1b10abSAndroid Build Coastguard Worker int q = oci->filter_level * 10 / 6;
151*fb1b10abSAndroid Build Coastguard Worker int flags = ppflags->post_proc_flag;
152*fb1b10abSAndroid Build Coastguard Worker int deblock_level = ppflags->deblocking_level;
153*fb1b10abSAndroid Build Coastguard Worker int noise_level = ppflags->noise_level;
154*fb1b10abSAndroid Build Coastguard Worker
155*fb1b10abSAndroid Build Coastguard Worker if (!oci->frame_to_show) return -1;
156*fb1b10abSAndroid Build Coastguard Worker
157*fb1b10abSAndroid Build Coastguard Worker if (q > 63) q = 63;
158*fb1b10abSAndroid Build Coastguard Worker
159*fb1b10abSAndroid Build Coastguard Worker if (!flags) {
160*fb1b10abSAndroid Build Coastguard Worker *dest = *oci->frame_to_show;
161*fb1b10abSAndroid Build Coastguard Worker
162*fb1b10abSAndroid Build Coastguard Worker /* handle problem with extending borders */
163*fb1b10abSAndroid Build Coastguard Worker dest->y_width = oci->Width;
164*fb1b10abSAndroid Build Coastguard Worker dest->y_height = oci->Height;
165*fb1b10abSAndroid Build Coastguard Worker dest->uv_height = dest->y_height / 2;
166*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_base_qindex = oci->base_qindex;
167*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_frame_valid = 1;
168*fb1b10abSAndroid Build Coastguard Worker return 0;
169*fb1b10abSAndroid Build Coastguard Worker }
170*fb1b10abSAndroid Build Coastguard Worker if (flags & VP8D_ADDNOISE) {
171*fb1b10abSAndroid Build Coastguard Worker if (!oci->postproc_state.generated_noise) {
172*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.generated_noise = vpx_calloc(
173*fb1b10abSAndroid Build Coastguard Worker oci->Width + 256, sizeof(*oci->postproc_state.generated_noise));
174*fb1b10abSAndroid Build Coastguard Worker if (!oci->postproc_state.generated_noise) return 1;
175*fb1b10abSAndroid Build Coastguard Worker }
176*fb1b10abSAndroid Build Coastguard Worker }
177*fb1b10abSAndroid Build Coastguard Worker
178*fb1b10abSAndroid Build Coastguard Worker /* Allocate post_proc_buffer_int if needed */
179*fb1b10abSAndroid Build Coastguard Worker if ((flags & VP8D_MFQE) && !oci->post_proc_buffer_int_used) {
180*fb1b10abSAndroid Build Coastguard Worker if ((flags & VP8D_DEBLOCK) || (flags & VP8D_DEMACROBLOCK)) {
181*fb1b10abSAndroid Build Coastguard Worker int width = (oci->Width + 15) & ~15;
182*fb1b10abSAndroid Build Coastguard Worker int height = (oci->Height + 15) & ~15;
183*fb1b10abSAndroid Build Coastguard Worker
184*fb1b10abSAndroid Build Coastguard Worker if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer_int, width, height,
185*fb1b10abSAndroid Build Coastguard Worker VP8BORDERINPIXELS)) {
186*fb1b10abSAndroid Build Coastguard Worker vpx_internal_error(&oci->error, VPX_CODEC_MEM_ERROR,
187*fb1b10abSAndroid Build Coastguard Worker "Failed to allocate MFQE framebuffer");
188*fb1b10abSAndroid Build Coastguard Worker }
189*fb1b10abSAndroid Build Coastguard Worker
190*fb1b10abSAndroid Build Coastguard Worker oci->post_proc_buffer_int_used = 1;
191*fb1b10abSAndroid Build Coastguard Worker
192*fb1b10abSAndroid Build Coastguard Worker /* insure that postproc is set to all 0's so that post proc
193*fb1b10abSAndroid Build Coastguard Worker * doesn't pull random data in from edge
194*fb1b10abSAndroid Build Coastguard Worker */
195*fb1b10abSAndroid Build Coastguard Worker memset((&oci->post_proc_buffer_int)->buffer_alloc, 128,
196*fb1b10abSAndroid Build Coastguard Worker (&oci->post_proc_buffer)->frame_size);
197*fb1b10abSAndroid Build Coastguard Worker }
198*fb1b10abSAndroid Build Coastguard Worker }
199*fb1b10abSAndroid Build Coastguard Worker
200*fb1b10abSAndroid Build Coastguard Worker vpx_clear_system_state();
201*fb1b10abSAndroid Build Coastguard Worker
202*fb1b10abSAndroid Build Coastguard Worker if ((flags & VP8D_MFQE) && oci->postproc_state.last_frame_valid &&
203*fb1b10abSAndroid Build Coastguard Worker oci->current_video_frame > 10 &&
204*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_base_qindex < 60 &&
205*fb1b10abSAndroid Build Coastguard Worker oci->base_qindex - oci->postproc_state.last_base_qindex >= 20) {
206*fb1b10abSAndroid Build Coastguard Worker vp8_multiframe_quality_enhance(oci);
207*fb1b10abSAndroid Build Coastguard Worker if (((flags & VP8D_DEBLOCK) || (flags & VP8D_DEMACROBLOCK)) &&
208*fb1b10abSAndroid Build Coastguard Worker oci->post_proc_buffer_int_used) {
209*fb1b10abSAndroid Build Coastguard Worker vp8_yv12_copy_frame(&oci->post_proc_buffer, &oci->post_proc_buffer_int);
210*fb1b10abSAndroid Build Coastguard Worker if (flags & VP8D_DEMACROBLOCK) {
211*fb1b10abSAndroid Build Coastguard Worker vp8_deblock(oci, &oci->post_proc_buffer_int, &oci->post_proc_buffer,
212*fb1b10abSAndroid Build Coastguard Worker q + (deblock_level - 5) * 10);
213*fb1b10abSAndroid Build Coastguard Worker vp8_de_mblock(&oci->post_proc_buffer, q + (deblock_level - 5) * 10);
214*fb1b10abSAndroid Build Coastguard Worker } else if (flags & VP8D_DEBLOCK) {
215*fb1b10abSAndroid Build Coastguard Worker vp8_deblock(oci, &oci->post_proc_buffer_int, &oci->post_proc_buffer, q);
216*fb1b10abSAndroid Build Coastguard Worker }
217*fb1b10abSAndroid Build Coastguard Worker }
218*fb1b10abSAndroid Build Coastguard Worker /* Move partially towards the base q of the previous frame */
219*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_base_qindex =
220*fb1b10abSAndroid Build Coastguard Worker (3 * oci->postproc_state.last_base_qindex + oci->base_qindex) >> 2;
221*fb1b10abSAndroid Build Coastguard Worker } else if (flags & VP8D_DEMACROBLOCK) {
222*fb1b10abSAndroid Build Coastguard Worker vp8_deblock(oci, oci->frame_to_show, &oci->post_proc_buffer,
223*fb1b10abSAndroid Build Coastguard Worker q + (deblock_level - 5) * 10);
224*fb1b10abSAndroid Build Coastguard Worker vp8_de_mblock(&oci->post_proc_buffer, q + (deblock_level - 5) * 10);
225*fb1b10abSAndroid Build Coastguard Worker
226*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_base_qindex = oci->base_qindex;
227*fb1b10abSAndroid Build Coastguard Worker } else if (flags & VP8D_DEBLOCK) {
228*fb1b10abSAndroid Build Coastguard Worker vp8_deblock(oci, oci->frame_to_show, &oci->post_proc_buffer, q);
229*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_base_qindex = oci->base_qindex;
230*fb1b10abSAndroid Build Coastguard Worker } else {
231*fb1b10abSAndroid Build Coastguard Worker vp8_yv12_copy_frame(oci->frame_to_show, &oci->post_proc_buffer);
232*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_base_qindex = oci->base_qindex;
233*fb1b10abSAndroid Build Coastguard Worker }
234*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_frame_valid = 1;
235*fb1b10abSAndroid Build Coastguard Worker
236*fb1b10abSAndroid Build Coastguard Worker if (flags & VP8D_ADDNOISE) {
237*fb1b10abSAndroid Build Coastguard Worker if (oci->postproc_state.last_q != q ||
238*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.last_noise != noise_level) {
239*fb1b10abSAndroid Build Coastguard Worker double sigma;
240*fb1b10abSAndroid Build Coastguard Worker struct postproc_state *ppstate = &oci->postproc_state;
241*fb1b10abSAndroid Build Coastguard Worker vpx_clear_system_state();
242*fb1b10abSAndroid Build Coastguard Worker sigma = noise_level + .5 + .6 * q / 63.0;
243*fb1b10abSAndroid Build Coastguard Worker ppstate->clamp =
244*fb1b10abSAndroid Build Coastguard Worker vpx_setup_noise(sigma, ppstate->generated_noise, oci->Width + 256);
245*fb1b10abSAndroid Build Coastguard Worker ppstate->last_q = q;
246*fb1b10abSAndroid Build Coastguard Worker ppstate->last_noise = noise_level;
247*fb1b10abSAndroid Build Coastguard Worker }
248*fb1b10abSAndroid Build Coastguard Worker
249*fb1b10abSAndroid Build Coastguard Worker vpx_plane_add_noise(
250*fb1b10abSAndroid Build Coastguard Worker oci->post_proc_buffer.y_buffer, oci->postproc_state.generated_noise,
251*fb1b10abSAndroid Build Coastguard Worker oci->postproc_state.clamp, oci->postproc_state.clamp,
252*fb1b10abSAndroid Build Coastguard Worker oci->post_proc_buffer.y_width, oci->post_proc_buffer.y_height,
253*fb1b10abSAndroid Build Coastguard Worker oci->post_proc_buffer.y_stride);
254*fb1b10abSAndroid Build Coastguard Worker }
255*fb1b10abSAndroid Build Coastguard Worker
256*fb1b10abSAndroid Build Coastguard Worker *dest = oci->post_proc_buffer;
257*fb1b10abSAndroid Build Coastguard Worker
258*fb1b10abSAndroid Build Coastguard Worker /* handle problem with extending borders */
259*fb1b10abSAndroid Build Coastguard Worker dest->y_width = oci->Width;
260*fb1b10abSAndroid Build Coastguard Worker dest->y_height = oci->Height;
261*fb1b10abSAndroid Build Coastguard Worker dest->uv_height = dest->y_height / 2;
262*fb1b10abSAndroid Build Coastguard Worker return 0;
263*fb1b10abSAndroid Build Coastguard Worker }
264*fb1b10abSAndroid Build Coastguard Worker #endif
265