Changeset 5939 for pjproject/trunk/pjmedia/src/pjmedia/converter_libyuv.c
- Timestamp:
- Mar 5, 2019 6:23:02 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia/converter_libyuv.c
r5378 r5939 37 37 pjmedia_frame *dst_frame); 38 38 39 static pj_status_t libyuv_conv_convert2( 40 pjmedia_converter *converter, 41 pjmedia_frame *src_frame, 42 const pjmedia_rect_size *src_frame_size, 43 const pjmedia_coord *src_pos, 44 pjmedia_frame *dst_frame, 45 const pjmedia_rect_size *dst_frame_size, 46 const pjmedia_coord *dst_pos, 47 void *param); 48 39 49 static void libyuv_conv_destroy(pjmedia_converter *converter); 40 50 … … 48 58 { 49 59 &libyuv_conv_convert, 50 &libyuv_conv_destroy 60 &libyuv_conv_destroy, 61 &libyuv_conv_convert2 51 62 }; 52 63 … … 347 358 348 359 /* Convert to I420 or BGRA if needed. */ 349 if ((src_id != PJMEDIA_FORMAT_I420) ||(src_id != PJMEDIA_FORMAT_BGRA)) {360 if ((src_id != PJMEDIA_FORMAT_I420) && (src_id != PJMEDIA_FORMAT_BGRA)) { 350 361 pj_uint32_t next_id = get_next_conv_fmt(src_id); 351 362 if (get_converter_map(src_id, next_id, src_size, dst_size, ++act_num, … … 359 370 360 371 /* Scale if needed */ 361 need_scale = ((src_size->w != dst_size->w) || 362 (src_size->h != dst_size->h)); 372 //need_scale = ((src_size->w != dst_size->w) || 373 //(src_size->h != dst_size->h)); 374 375 // Always enable scale, as this can be used for rendering a region of 376 // a frame to another region of similar/another frame. 377 need_scale = PJ_TRUE; 363 378 364 379 if (need_scale) { … … 623 638 } 624 639 640 static pj_status_t libyuv_conv_convert2( 641 pjmedia_converter *converter, 642 pjmedia_frame *src_frame, 643 const pjmedia_rect_size *src_frame_size, 644 const pjmedia_coord *src_pos, 645 pjmedia_frame *dst_frame, 646 const pjmedia_rect_size *dst_frame_size, 647 const pjmedia_coord *dst_pos, 648 pjmedia_converter_convert_setting 649 *param) 650 { 651 struct libyuv_converter *lconv = (struct libyuv_converter*)converter; 652 int i = 0; 653 fmt_info *src_info = &lconv->act[0].src_fmt_info; 654 fmt_info *dst_info = &lconv->act[lconv->act_num-1].dst_fmt_info; 655 pjmedia_rect_size orig_src_size; 656 pjmedia_rect_size orig_dst_size; 657 658 PJ_UNUSED_ARG(param); 659 660 /* Save original conversion sizes */ 661 orig_src_size = src_info->apply_param.size; 662 orig_dst_size = dst_info->apply_param.size; 663 664 /* Set the first act buffer from src frame, and overwrite size. */ 665 src_info->apply_param.buffer = src_frame->buf; 666 src_info->apply_param.size = *src_frame_size; 667 668 /* Set the last act buffer from dst frame, and overwrite size. */ 669 dst_info->apply_param.buffer = dst_frame->buf; 670 dst_info->apply_param.size = *dst_frame_size; 671 672 for (i=0;i<lconv->act_num;++i) { 673 /* Use destination info as the source info for the next act. */ 674 struct fmt_info *src_fmt_info = (i==0)? src_info : 675 &lconv->act[i-1].dst_fmt_info; 676 677 struct fmt_info *dst_fmt_info = &lconv->act[i].dst_fmt_info; 678 679 (*src_fmt_info->vid_fmt_info->apply_fmt)(src_fmt_info->vid_fmt_info, 680 &src_fmt_info->apply_param); 681 682 (*dst_fmt_info->vid_fmt_info->apply_fmt)(dst_fmt_info->vid_fmt_info, 683 &dst_fmt_info->apply_param); 684 685 /* For first and last acts, apply plane buffer offset and return back 686 * the original sizes. 687 */ 688 if (i == 0) { 689 pjmedia_video_apply_fmt_param *ap = &src_fmt_info->apply_param; 690 unsigned j; 691 for (j = 0; j < src_fmt_info->vid_fmt_info->plane_cnt; ++j) { 692 int y = src_pos->y * ap->plane_bytes[j] / ap->strides[j] / 693 ap->size.h; 694 ap->planes[j] += y * ap->strides[j] + src_pos->x * 695 ap->strides[j] / ap->size.w; 696 } 697 ap->size = orig_src_size; 698 } 699 if (i == lconv->act_num-1) { 700 pjmedia_video_apply_fmt_param *ap = &dst_fmt_info->apply_param; 701 unsigned j; 702 for (j = 0; j < dst_fmt_info->vid_fmt_info->plane_cnt; ++j) 703 { 704 int y = dst_pos->y * ap->plane_bytes[j] / ap->strides[j] / 705 ap->size.h; 706 ap->planes[j] += y * ap->strides[j] + dst_pos->x * 707 ap->strides[j] / ap->size.w; 708 } 709 ap->size = orig_dst_size; 710 } 711 712 switch (lconv->act[i].act_type) { 713 case CONV_PACK_TO_PACK: 714 (*lconv->act[i].method.conv_pack_to_pack)( 715 (const uint8*)src_fmt_info->apply_param.planes[0], 716 src_fmt_info->apply_param.strides[0], 717 dst_fmt_info->apply_param.planes[0], 718 dst_fmt_info->apply_param.strides[0], 719 dst_fmt_info->apply_param.size.w, 720 dst_fmt_info->apply_param.size.h); 721 break; 722 case CONV_PACK_TO_PLANAR: 723 (*lconv->act[i].method.conv_pack_to_planar)( 724 (const uint8*)src_fmt_info->apply_param.planes[0], 725 src_fmt_info->apply_param.strides[0], 726 dst_fmt_info->apply_param.planes[0], 727 dst_fmt_info->apply_param.strides[0], 728 dst_fmt_info->apply_param.planes[1], 729 dst_fmt_info->apply_param.strides[1], 730 dst_fmt_info->apply_param.planes[2], 731 dst_fmt_info->apply_param.strides[2], 732 dst_fmt_info->apply_param.size.w, 733 dst_fmt_info->apply_param.size.h); 734 break; 735 case CONV_PLANAR_TO_PACK: 736 (*lconv->act[i].method.conv_planar_to_pack)( 737 (const uint8*)src_fmt_info->apply_param.planes[0], 738 src_fmt_info->apply_param.strides[0], 739 (const uint8*)src_fmt_info->apply_param.planes[1], 740 src_fmt_info->apply_param.strides[1], 741 (const uint8*)src_fmt_info->apply_param.planes[2], 742 src_fmt_info->apply_param.strides[2], 743 dst_fmt_info->apply_param.planes[0], 744 dst_fmt_info->apply_param.strides[0], 745 dst_fmt_info->apply_param.size.w, 746 dst_fmt_info->apply_param.size.h); 747 break; 748 case CONV_PLANAR_TO_PLANAR: 749 (*lconv->act[i].method.conv_planar_to_planar)( 750 (const uint8*)src_fmt_info->apply_param.planes[0], 751 src_fmt_info->apply_param.strides[0], 752 (const uint8*)src_fmt_info->apply_param.planes[1], 753 src_fmt_info->apply_param.strides[1], 754 (const uint8*)src_fmt_info->apply_param.planes[2], 755 src_fmt_info->apply_param.strides[2], 756 dst_fmt_info->apply_param.planes[0], 757 dst_fmt_info->apply_param.strides[0], 758 dst_fmt_info->apply_param.planes[1], 759 dst_fmt_info->apply_param.strides[1], 760 dst_fmt_info->apply_param.planes[2], 761 dst_fmt_info->apply_param.strides[2], 762 dst_fmt_info->apply_param.size.w, 763 dst_fmt_info->apply_param.size.h); 764 break; 765 case SCALE_PACK: 766 (*lconv->act[i].method.scale_pack)( 767 (const uint8*)src_fmt_info->apply_param.planes[0], 768 src_fmt_info->apply_param.strides[0], 769 src_fmt_info->apply_param.size.w, 770 src_fmt_info->apply_param.size.h, 771 (uint8*)dst_fmt_info->apply_param.planes[0], 772 dst_fmt_info->apply_param.strides[0], 773 dst_fmt_info->apply_param.size.w, 774 dst_fmt_info->apply_param.size.h, 775 LIBYUV_FILTER_MODE); 776 break; 777 case SCALE_PLANAR: 778 (*lconv->act[i].method.scale_planar)( 779 (const uint8*)src_fmt_info->apply_param.planes[0], 780 src_fmt_info->apply_param.strides[0], 781 (const uint8*)src_fmt_info->apply_param.planes[1], 782 src_fmt_info->apply_param.strides[1], 783 (const uint8*)src_fmt_info->apply_param.planes[2], 784 src_fmt_info->apply_param.strides[2], 785 src_fmt_info->apply_param.size.w, 786 src_fmt_info->apply_param.size.h, 787 (uint8*)dst_fmt_info->apply_param.planes[0], 788 dst_fmt_info->apply_param.strides[0], 789 (uint8*)dst_fmt_info->apply_param.planes[1], 790 dst_fmt_info->apply_param.strides[1], 791 (uint8*)dst_fmt_info->apply_param.planes[2], 792 dst_fmt_info->apply_param.strides[2], 793 dst_fmt_info->apply_param.size.w, 794 dst_fmt_info->apply_param.size.h, 795 LIBYUV_FILTER_MODE); 796 break; 797 }; 798 } 799 return PJ_SUCCESS; 800 } 801 625 802 static void libyuv_conv_destroy(pjmedia_converter *converter) 626 803 {
Note: See TracChangeset
for help on using the changeset viewer.