Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Side by Side Diff: source/libvpx/vp9/vp9_dx_iface.c

Issue 111463005: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/vp9_cx_iface.c ('k') | source/libvpx/vp9/vp9cx.mk » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 unsigned int dbg_postproc_flag; 52 unsigned int dbg_postproc_flag;
53 int dbg_color_ref_frame_flag; 53 int dbg_color_ref_frame_flag;
54 int dbg_color_mb_modes_flag; 54 int dbg_color_mb_modes_flag;
55 int dbg_color_b_modes_flag; 55 int dbg_color_b_modes_flag;
56 int dbg_display_mv_flag; 56 int dbg_display_mv_flag;
57 #endif 57 #endif
58 vpx_image_t img; 58 vpx_image_t img;
59 int img_setup; 59 int img_setup;
60 int img_avail; 60 int img_avail;
61 int invert_tile_order; 61 int invert_tile_order;
62 int fb_lru;
63
64 /* External buffer info to save for VP9 common. */
65 vpx_codec_frame_buffer_t *fb_list; // External frame buffers
66 int fb_count; // Total number of frame buffers
67 vpx_realloc_frame_buffer_cb_fn_t realloc_fb_cb;
68 void *user_priv; // Private data associated with the external frame buffers.
62 }; 69 };
63 70
64 static unsigned long priv_sz(const vpx_codec_dec_cfg_t *si, 71 static unsigned long priv_sz(const vpx_codec_dec_cfg_t *si,
65 vpx_codec_flags_t flags) { 72 vpx_codec_flags_t flags) {
66 /* Although this declaration is constant, we can't use it in the requested 73 /* Although this declaration is constant, we can't use it in the requested
67 * segments list because we want to define the requested segments list 74 * segments list because we want to define the requested segments list
68 * before defining the private type (so that the number of memory maps is 75 * before defining the private type (so that the number of memory maps is
69 * known) 76 * known)
70 */ 77 */
71 (void)si; 78 (void)si;
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 * configuration has not been provided, default it. 307 * configuration has not been provided, default it.
301 */ 308 */
302 if (!ctx->postproc_cfg_set 309 if (!ctx->postproc_cfg_set
303 && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) { 310 && (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) {
304 ctx->postproc_cfg.post_proc_flag = 311 ctx->postproc_cfg.post_proc_flag =
305 VP8_DEBLOCK | VP8_DEMACROBLOCK; 312 VP8_DEBLOCK | VP8_DEMACROBLOCK;
306 ctx->postproc_cfg.deblocking_level = 4; 313 ctx->postproc_cfg.deblocking_level = 4;
307 ctx->postproc_cfg.noise_level = 0; 314 ctx->postproc_cfg.noise_level = 0;
308 } 315 }
309 316
310 if (!optr) 317 if (!optr) {
311 res = VPX_CODEC_ERROR; 318 res = VPX_CODEC_ERROR;
312 else 319 } else {
320 VP9D_COMP *const pbi = (VP9D_COMP*)optr;
321 VP9_COMMON *const cm = &pbi->common;
322 if (ctx->fb_list != NULL && ctx->realloc_fb_cb != NULL &&
323 ctx->fb_count > 0) {
324 cm->fb_list = ctx->fb_list;
325 cm->fb_count = ctx->fb_count;
326 cm->realloc_fb_cb = ctx->realloc_fb_cb;
327 cm->user_priv = ctx->user_priv;
328 } else {
329 cm->fb_count = FRAME_BUFFERS;
330 }
331 cm->fb_lru = ctx->fb_lru;
332 CHECK_MEM_ERROR(cm, cm->yv12_fb,
333 vpx_calloc(cm->fb_count, sizeof(*cm->yv12_fb)));
334 CHECK_MEM_ERROR(cm, cm->fb_idx_ref_cnt,
335 vpx_calloc(cm->fb_count, sizeof(*cm->fb_idx_ref_cnt)));
336 if (cm->fb_lru) {
337 CHECK_MEM_ERROR(cm, cm->fb_idx_ref_lru,
338 vpx_calloc(cm->fb_count,
339 sizeof(*cm->fb_idx_ref_lru)));
340 }
313 ctx->pbi = optr; 341 ctx->pbi = optr;
342 }
314 } 343 }
315 344
316 ctx->decoder_init = 1; 345 ctx->decoder_init = 1;
317 } 346 }
318 347
319 if (!res && ctx->pbi) { 348 if (!res && ctx->pbi) {
320 YV12_BUFFER_CONFIG sd; 349 YV12_BUFFER_CONFIG sd;
321 int64_t time_stamp = 0, time_end_stamp = 0; 350 int64_t time_stamp = 0, time_end_stamp = 0;
322 vp9_ppflags_t flags = {0}; 351 vp9_ppflags_t flags = {0};
323 352
(...skipping 16 matching lines...) Expand all
340 flags.noise_level = ctx->postproc_cfg.noise_level; 369 flags.noise_level = ctx->postproc_cfg.noise_level;
341 #if CONFIG_POSTPROC_VISUALIZER 370 #if CONFIG_POSTPROC_VISUALIZER
342 flags.display_ref_frame_flag = ctx->dbg_color_ref_frame_flag; 371 flags.display_ref_frame_flag = ctx->dbg_color_ref_frame_flag;
343 flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag; 372 flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
344 flags.display_b_modes_flag = ctx->dbg_color_b_modes_flag; 373 flags.display_b_modes_flag = ctx->dbg_color_b_modes_flag;
345 flags.display_mv_flag = ctx->dbg_display_mv_flag; 374 flags.display_mv_flag = ctx->dbg_display_mv_flag;
346 #endif 375 #endif
347 } 376 }
348 377
349 if (vp9_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) { 378 if (vp9_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) {
350 VP9D_COMP *pbi = (VP9D_COMP *)ctx->pbi; 379 VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
351 res = update_error_state(ctx, &pbi->common.error); 380 res = update_error_state(ctx, &pbi->common.error);
352 } 381 }
353 382
354 if (!res && 0 == vp9_get_raw_frame(ctx->pbi, &sd, &time_stamp, 383 if (!res && 0 == vp9_get_raw_frame(ctx->pbi, &sd, &time_stamp,
355 &time_end_stamp, &flags)) { 384 &time_end_stamp, &flags)) {
356 yuvconfig2image(&ctx->img, &sd, user_priv); 385 yuvconfig2image(&ctx->img, &sd, user_priv);
357 ctx->img_avail = 1; 386 ctx->img_avail = 1;
358 } 387 }
359 } 388 }
360 389
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 if (!(*iter)) { 497 if (!(*iter)) {
469 img = &ctx->img; 498 img = &ctx->img;
470 *iter = img; 499 *iter = img;
471 } 500 }
472 } 501 }
473 ctx->img_avail = 0; 502 ctx->img_avail = 0;
474 503
475 return img; 504 return img;
476 } 505 }
477 506
507 static vpx_codec_err_t vp9_set_frame_buffers(
508 vpx_codec_alg_priv_t *ctx,
509 vpx_codec_frame_buffer_t *fb_list, int fb_count,
510 vpx_realloc_frame_buffer_cb_fn_t cb, void *user_priv) {
511 if (fb_count < REF_FRAMES) {
512 /* The application must pass in at least REF_FRAMES frame buffers. */
513 return VPX_CODEC_INVALID_PARAM;
514 } else if (!ctx->pbi) {
515 /* If the decoder has already been initialized, do not accept external
516 * frame buffers.
517 */
518 ctx->fb_list = fb_list;
519 ctx->fb_count = fb_count;
520 ctx->realloc_fb_cb = cb;
521 ctx->user_priv = user_priv;
522 return VPX_CODEC_OK;
523 }
524
525 return VPX_CODEC_ERROR;
526 }
527
478 static vpx_codec_err_t vp9_xma_get_mmap(const vpx_codec_ctx_t *ctx, 528 static vpx_codec_err_t vp9_xma_get_mmap(const vpx_codec_ctx_t *ctx,
479 vpx_codec_mmap_t *mmap, 529 vpx_codec_mmap_t *mmap,
480 vpx_codec_iter_t *iter) { 530 vpx_codec_iter_t *iter) {
481 vpx_codec_err_t res; 531 vpx_codec_err_t res;
482 const mem_req_t *seg_iter = *iter; 532 const mem_req_t *seg_iter = *iter;
483 533
484 /* Get address of next segment request */ 534 /* Get address of next segment request */
485 do { 535 do {
486 if (!seg_iter) 536 if (!seg_iter)
487 seg_iter = vp9_mem_req_segs; 537 seg_iter = vp9_mem_req_segs;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 return VPX_CODEC_OK; 682 return VPX_CODEC_OK;
633 #else 683 #else
634 return VPX_CODEC_INCAPABLE; 684 return VPX_CODEC_INCAPABLE;
635 #endif 685 #endif
636 } 686 }
637 687
638 static vpx_codec_err_t get_last_ref_updates(vpx_codec_alg_priv_t *ctx, 688 static vpx_codec_err_t get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
639 int ctrl_id, 689 int ctrl_id,
640 va_list args) { 690 va_list args) {
641 int *update_info = va_arg(args, int *); 691 int *update_info = va_arg(args, int *);
642 VP9D_COMP *pbi = (VP9D_COMP *)ctx->pbi; 692 VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
643 693
644 if (update_info) { 694 if (update_info) {
645 *update_info = pbi->refresh_frame_flags; 695 *update_info = pbi->refresh_frame_flags;
646 696
647 return VPX_CODEC_OK; 697 return VPX_CODEC_OK;
648 } else { 698 } else {
649 return VPX_CODEC_INVALID_PARAM; 699 return VPX_CODEC_INVALID_PARAM;
650 } 700 }
651 } 701 }
652 702
653 703
654 static vpx_codec_err_t get_frame_corrupted(vpx_codec_alg_priv_t *ctx, 704 static vpx_codec_err_t get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
655 int ctrl_id, 705 int ctrl_id,
656 va_list args) { 706 va_list args) {
657 int *corrupted = va_arg(args, int *); 707 int *corrupted = va_arg(args, int *);
658 708
659 if (corrupted) { 709 if (corrupted) {
660 VP9D_COMP *pbi = (VP9D_COMP *)ctx->pbi; 710 VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
661 if (pbi) 711 if (pbi)
662 *corrupted = pbi->common.frame_to_show->corrupted; 712 *corrupted = pbi->common.frame_to_show->corrupted;
663 else 713 else
664 return VPX_CODEC_ERROR; 714 return VPX_CODEC_ERROR;
665 return VPX_CODEC_OK; 715 return VPX_CODEC_OK;
666 } else { 716 } else {
667 return VPX_CODEC_INVALID_PARAM; 717 return VPX_CODEC_INVALID_PARAM;
668 } 718 }
669 } 719 }
670 720
721 static vpx_codec_err_t get_display_size(vpx_codec_alg_priv_t *ctx,
722 int ctrl_id,
723 va_list args) {
724 int *const display_size = va_arg(args, int *);
725
726 if (display_size) {
727 const VP9D_COMP *const pbi = (VP9D_COMP*)ctx->pbi;
728 if (pbi) {
729 display_size[0] = pbi->common.display_width;
730 display_size[1] = pbi->common.display_height;
731 } else {
732 return VPX_CODEC_ERROR;
733 }
734 return VPX_CODEC_OK;
735 } else {
736 return VPX_CODEC_INVALID_PARAM;
737 }
738 }
739
671 static vpx_codec_err_t set_invert_tile_order(vpx_codec_alg_priv_t *ctx, 740 static vpx_codec_err_t set_invert_tile_order(vpx_codec_alg_priv_t *ctx,
672 int ctr_id, 741 int ctr_id,
673 va_list args) { 742 va_list args) {
674 ctx->invert_tile_order = va_arg(args, int); 743 ctx->invert_tile_order = va_arg(args, int);
675 return VPX_CODEC_OK; 744 return VPX_CODEC_OK;
676 } 745 }
677 746
747 static vpx_codec_err_t set_frame_buffer_lru_cache(vpx_codec_alg_priv_t *ctx,
748 int ctr_id,
749 va_list args) {
750 VP9D_COMP *const pbi = (VP9D_COMP*)ctx->pbi;
751
752 // Save for later to pass into vp9 common.
753 ctx->fb_lru = va_arg(args, int);
754
755 if (pbi) {
756 VP9_COMMON *const cm = &pbi->common;
757 cm->fb_lru = ctx->fb_lru;
758 }
759 return VPX_CODEC_OK;
760 }
761
678 static vpx_codec_ctrl_fn_map_t ctf_maps[] = { 762 static vpx_codec_ctrl_fn_map_t ctf_maps[] = {
679 {VP8_SET_REFERENCE, set_reference}, 763 {VP8_SET_REFERENCE, set_reference},
680 {VP8_COPY_REFERENCE, copy_reference}, 764 {VP8_COPY_REFERENCE, copy_reference},
681 {VP8_SET_POSTPROC, set_postproc}, 765 {VP8_SET_POSTPROC, set_postproc},
682 {VP8_SET_DBG_COLOR_REF_FRAME, set_dbg_options}, 766 {VP8_SET_DBG_COLOR_REF_FRAME, set_dbg_options},
683 {VP8_SET_DBG_COLOR_MB_MODES, set_dbg_options}, 767 {VP8_SET_DBG_COLOR_MB_MODES, set_dbg_options},
684 {VP8_SET_DBG_COLOR_B_MODES, set_dbg_options}, 768 {VP8_SET_DBG_COLOR_B_MODES, set_dbg_options},
685 {VP8_SET_DBG_DISPLAY_MV, set_dbg_options}, 769 {VP8_SET_DBG_DISPLAY_MV, set_dbg_options},
686 {VP8D_GET_LAST_REF_UPDATES, get_last_ref_updates}, 770 {VP8D_GET_LAST_REF_UPDATES, get_last_ref_updates},
687 {VP8D_GET_FRAME_CORRUPTED, get_frame_corrupted}, 771 {VP8D_GET_FRAME_CORRUPTED, get_frame_corrupted},
688 {VP9_GET_REFERENCE, get_reference}, 772 {VP9_GET_REFERENCE, get_reference},
773 {VP9D_GET_DISPLAY_SIZE, get_display_size},
689 {VP9_INVERT_TILE_DECODE_ORDER, set_invert_tile_order}, 774 {VP9_INVERT_TILE_DECODE_ORDER, set_invert_tile_order},
775 {VP9D_SET_FRAME_BUFFER_LRU_CACHE, set_frame_buffer_lru_cache},
690 { -1, NULL}, 776 { -1, NULL},
691 }; 777 };
692 778
693 779
694 #ifndef VERSION_STRING 780 #ifndef VERSION_STRING
695 #define VERSION_STRING 781 #define VERSION_STRING
696 #endif 782 #endif
697 CODEC_INTERFACE(vpx_codec_vp9_dx) = { 783 CODEC_INTERFACE(vpx_codec_vp9_dx) = {
698 "WebM Project VP9 Decoder" VERSION_STRING, 784 "WebM Project VP9 Decoder" VERSION_STRING,
699 VPX_CODEC_INTERNAL_ABI_VERSION, 785 VPX_CODEC_INTERNAL_ABI_VERSION,
700 VPX_CODEC_CAP_DECODER | VP9_CAP_POSTPROC, 786 VPX_CODEC_CAP_DECODER | VP9_CAP_POSTPROC |
787 VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER,
701 /* vpx_codec_caps_t caps; */ 788 /* vpx_codec_caps_t caps; */
702 vp9_init, /* vpx_codec_init_fn_t init; */ 789 vp9_init, /* vpx_codec_init_fn_t init; */
703 vp9_destroy, /* vpx_codec_destroy_fn_t destroy; */ 790 vp9_destroy, /* vpx_codec_destroy_fn_t destroy; */
704 ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ 791 ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */
705 vp9_xma_get_mmap, /* vpx_codec_get_mmap_fn_t get_mmap; */ 792 vp9_xma_get_mmap, /* vpx_codec_get_mmap_fn_t get_mmap; */
706 vp9_xma_set_mmap, /* vpx_codec_set_mmap_fn_t set_mmap; */ 793 vp9_xma_set_mmap, /* vpx_codec_set_mmap_fn_t set_mmap; */
707 { // NOLINT 794 { // NOLINT
708 vp9_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */ 795 vp9_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */
709 vp9_get_si, /* vpx_codec_get_si_fn_t get_si; */ 796 vp9_get_si, /* vpx_codec_get_si_fn_t get_si; */
710 vp9_decode, /* vpx_codec_decode_fn_t decode; */ 797 vp9_decode, /* vpx_codec_decode_fn_t decode; */
711 vp9_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */ 798 vp9_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */
799 vp9_set_frame_buffers, /* vpx_codec_set_frame_buffers_fn_t set_fb; */
712 }, 800 },
713 { // NOLINT 801 { // NOLINT
714 /* encoder functions */ 802 /* encoder functions */
715 NOT_IMPLEMENTED, 803 NOT_IMPLEMENTED,
716 NOT_IMPLEMENTED, 804 NOT_IMPLEMENTED,
717 NOT_IMPLEMENTED, 805 NOT_IMPLEMENTED,
718 NOT_IMPLEMENTED, 806 NOT_IMPLEMENTED,
719 NOT_IMPLEMENTED, 807 NOT_IMPLEMENTED,
720 NOT_IMPLEMENTED 808 NOT_IMPLEMENTED
721 } 809 }
722 }; 810 };
OLDNEW
« no previous file with comments | « source/libvpx/vp9/vp9_cx_iface.c ('k') | source/libvpx/vp9/vp9cx.mk » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698