OLD | NEW |
1 // Copyright 2011 Google Inc. All Rights Reserved. | 1 // Copyright 2011 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // Use of this source code is governed by a BSD-style license | 3 // Use of this source code is governed by a BSD-style license |
4 // that can be found in the COPYING file in the root of the source | 4 // that can be found in the COPYING file in the root of the source |
5 // tree. An additional intellectual property rights grant can be found | 5 // tree. An additional intellectual property rights grant can be found |
6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
9 // | 9 // |
10 // functions for sample output. | 10 // functions for sample output. |
11 // | 11 // |
12 // Author: Skal (pascal.massimino@gmail.com) | 12 // Author: Skal (pascal.massimino@gmail.com) |
13 | 13 |
14 #include <assert.h> | 14 #include <assert.h> |
15 #include <stdlib.h> | 15 #include <stdlib.h> |
16 #include "../dec/vp8i.h" | 16 #include "../dec/vp8i.h" |
17 #include "./webpi.h" | 17 #include "./webpi.h" |
18 #include "../dsp/dsp.h" | 18 #include "../dsp/dsp.h" |
19 #include "../dsp/yuv.h" | 19 #include "../dsp/yuv.h" |
20 | 20 |
21 #if defined(__cplusplus) || defined(c_plusplus) | |
22 extern "C" { | |
23 #endif | |
24 | |
25 //------------------------------------------------------------------------------ | 21 //------------------------------------------------------------------------------ |
26 // Main YUV<->RGB conversion functions | 22 // Main YUV<->RGB conversion functions |
27 | 23 |
28 static int EmitYUV(const VP8Io* const io, WebPDecParams* const p) { | 24 static int EmitYUV(const VP8Io* const io, WebPDecParams* const p) { |
29 WebPDecBuffer* output = p->output; | 25 WebPDecBuffer* output = p->output; |
30 const WebPYUVABuffer* const buf = &output->u.YUVA; | 26 const WebPYUVABuffer* const buf = &output->u.YUVA; |
31 uint8_t* const y_dst = buf->y + io->mb_y * buf->y_stride; | 27 uint8_t* const y_dst = buf->y + io->mb_y * buf->y_stride; |
32 uint8_t* const u_dst = buf->u + (io->mb_y >> 1) * buf->u_stride; | 28 uint8_t* const u_dst = buf->u + (io->mb_y >> 1) * buf->u_stride; |
33 uint8_t* const v_dst = buf->v + (io->mb_y >> 1) * buf->v_stride; | 29 uint8_t* const v_dst = buf->v + (io->mb_y >> 1) * buf->v_stride; |
34 const int mb_w = io->mb_w; | 30 const int mb_w = io->mb_w; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 const uint8_t* cur_v = io->v; | 108 const uint8_t* cur_v = io->v; |
113 const uint8_t* top_u = p->tmp_u; | 109 const uint8_t* top_u = p->tmp_u; |
114 const uint8_t* top_v = p->tmp_v; | 110 const uint8_t* top_v = p->tmp_v; |
115 int y = io->mb_y; | 111 int y = io->mb_y; |
116 const int y_end = io->mb_y + io->mb_h; | 112 const int y_end = io->mb_y + io->mb_h; |
117 const int mb_w = io->mb_w; | 113 const int mb_w = io->mb_w; |
118 const int uv_w = (mb_w + 1) / 2; | 114 const int uv_w = (mb_w + 1) / 2; |
119 | 115 |
120 if (y == 0) { | 116 if (y == 0) { |
121 // First line is special cased. We mirror the u/v samples at boundary. | 117 // First line is special cased. We mirror the u/v samples at boundary. |
122 upsample(NULL, cur_y, cur_u, cur_v, cur_u, cur_v, NULL, dst, mb_w); | 118 upsample(cur_y, NULL, cur_u, cur_v, cur_u, cur_v, dst, NULL, mb_w); |
123 } else { | 119 } else { |
124 // We can finish the left-over line from previous call. | 120 // We can finish the left-over line from previous call. |
125 upsample(p->tmp_y, cur_y, top_u, top_v, cur_u, cur_v, | 121 upsample(p->tmp_y, cur_y, top_u, top_v, cur_u, cur_v, |
126 dst - buf->stride, dst, mb_w); | 122 dst - buf->stride, dst, mb_w); |
127 ++num_lines_out; | 123 ++num_lines_out; |
128 } | 124 } |
129 // Loop over each output pairs of row. | 125 // Loop over each output pairs of row. |
130 for (; y + 2 < y_end; y += 2) { | 126 for (; y + 2 < y_end; y += 2) { |
131 top_u = cur_u; | 127 top_u = cur_u; |
132 top_v = cur_v; | 128 top_v = cur_v; |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
596 WebPDecParams* const p = (WebPDecParams*)io->opaque; | 592 WebPDecParams* const p = (WebPDecParams*)io->opaque; |
597 const int mb_w = io->mb_w; | 593 const int mb_w = io->mb_w; |
598 const int mb_h = io->mb_h; | 594 const int mb_h = io->mb_h; |
599 int num_lines_out; | 595 int num_lines_out; |
600 assert(!(io->mb_y & 1)); | 596 assert(!(io->mb_y & 1)); |
601 | 597 |
602 if (mb_w <= 0 || mb_h <= 0) { | 598 if (mb_w <= 0 || mb_h <= 0) { |
603 return 0; | 599 return 0; |
604 } | 600 } |
605 num_lines_out = p->emit(io, p); | 601 num_lines_out = p->emit(io, p); |
606 if (p->emit_alpha) { | 602 if (p->emit_alpha != NULL) { |
607 p->emit_alpha(io, p); | 603 p->emit_alpha(io, p); |
608 } | 604 } |
609 p->last_y += num_lines_out; | 605 p->last_y += num_lines_out; |
610 return 1; | 606 return 1; |
611 } | 607 } |
612 | 608 |
613 //------------------------------------------------------------------------------ | 609 //------------------------------------------------------------------------------ |
614 | 610 |
615 static void CustomTeardown(const VP8Io* io) { | 611 static void CustomTeardown(const VP8Io* io) { |
616 WebPDecParams* const p = (WebPDecParams*)io->opaque; | 612 WebPDecParams* const p = (WebPDecParams*)io->opaque; |
617 free(p->memory); | 613 free(p->memory); |
618 p->memory = NULL; | 614 p->memory = NULL; |
619 } | 615 } |
620 | 616 |
621 //------------------------------------------------------------------------------ | 617 //------------------------------------------------------------------------------ |
622 // Main entry point | 618 // Main entry point |
623 | 619 |
624 void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io) { | 620 void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io) { |
625 io->put = CustomPut; | 621 io->put = CustomPut; |
626 io->setup = CustomSetup; | 622 io->setup = CustomSetup; |
627 io->teardown = CustomTeardown; | 623 io->teardown = CustomTeardown; |
628 io->opaque = params; | 624 io->opaque = params; |
629 } | 625 } |
630 | 626 |
631 //------------------------------------------------------------------------------ | 627 //------------------------------------------------------------------------------ |
632 | 628 |
633 #if defined(__cplusplus) || defined(c_plusplus) | |
634 } // extern "C" | |
635 #endif | |
OLD | NEW |