annotate ffmpeg/libavcodec/rectangle.h @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * rectangle filling function
yading@10 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 /**
yading@10 23 * @file
yading@10 24 * useful rectangle filling function
yading@10 25 * @author Michael Niedermayer <michaelni@gmx.at>
yading@10 26 */
yading@10 27
yading@10 28 #ifndef AVCODEC_RECTANGLE_H
yading@10 29 #define AVCODEC_RECTANGLE_H
yading@10 30
yading@10 31 #include "config.h"
yading@10 32 #include "libavutil/common.h"
yading@10 33 #include "libavutil/avassert.h"
yading@10 34
yading@10 35 /**
yading@10 36 * fill a rectangle.
yading@10 37 * @param h height of the rectangle, should be a constant
yading@10 38 * @param w width of the rectangle, should be a constant
yading@10 39 * @param size the size of val (1, 2 or 4), should be a constant
yading@10 40 */
yading@10 41 static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride, uint32_t val, int size){
yading@10 42 uint8_t *p= (uint8_t*)vp;
yading@10 43 av_assert2(size==1 || size==2 || size==4);
yading@10 44 av_assert2(w<=4);
yading@10 45
yading@10 46 w *= size;
yading@10 47 stride *= size;
yading@10 48
yading@10 49 av_assert2((((long)vp)&(FFMIN(w, 8<<(HAVE_NEON|ARCH_PPC|HAVE_MMX))-1)) == 0);
yading@10 50 av_assert2((stride&(w-1))==0);
yading@10 51 if(w==2){
yading@10 52 const uint16_t v= size==4 ? val : val*0x0101;
yading@10 53 *(uint16_t*)(p + 0*stride)= v;
yading@10 54 if(h==1) return;
yading@10 55 *(uint16_t*)(p + 1*stride)= v;
yading@10 56 if(h==2) return;
yading@10 57 *(uint16_t*)(p + 2*stride)= v;
yading@10 58 *(uint16_t*)(p + 3*stride)= v;
yading@10 59 }else if(w==4){
yading@10 60 const uint32_t v= size==4 ? val : size==2 ? val*0x00010001 : val*0x01010101;
yading@10 61 *(uint32_t*)(p + 0*stride)= v;
yading@10 62 if(h==1) return;
yading@10 63 *(uint32_t*)(p + 1*stride)= v;
yading@10 64 if(h==2) return;
yading@10 65 *(uint32_t*)(p + 2*stride)= v;
yading@10 66 *(uint32_t*)(p + 3*stride)= v;
yading@10 67 }else if(w==8){
yading@10 68 //gcc can't optimize 64bit math on x86_32
yading@10 69 #if HAVE_FAST_64BIT
yading@10 70 const uint64_t v= size==2 ? val*0x0001000100010001ULL : val*0x0100000001ULL;
yading@10 71 *(uint64_t*)(p + 0*stride)= v;
yading@10 72 if(h==1) return;
yading@10 73 *(uint64_t*)(p + 1*stride)= v;
yading@10 74 if(h==2) return;
yading@10 75 *(uint64_t*)(p + 2*stride)= v;
yading@10 76 *(uint64_t*)(p + 3*stride)= v;
yading@10 77 }else if(w==16){
yading@10 78 const uint64_t v= val*0x0100000001ULL;
yading@10 79 *(uint64_t*)(p + 0+0*stride)= v;
yading@10 80 *(uint64_t*)(p + 8+0*stride)= v;
yading@10 81 *(uint64_t*)(p + 0+1*stride)= v;
yading@10 82 *(uint64_t*)(p + 8+1*stride)= v;
yading@10 83 if(h==2) return;
yading@10 84 *(uint64_t*)(p + 0+2*stride)= v;
yading@10 85 *(uint64_t*)(p + 8+2*stride)= v;
yading@10 86 *(uint64_t*)(p + 0+3*stride)= v;
yading@10 87 *(uint64_t*)(p + 8+3*stride)= v;
yading@10 88 #else
yading@10 89 const uint32_t v= size==2 ? val*0x00010001 : val;
yading@10 90 *(uint32_t*)(p + 0+0*stride)= v;
yading@10 91 *(uint32_t*)(p + 4+0*stride)= v;
yading@10 92 if(h==1) return;
yading@10 93 *(uint32_t*)(p + 0+1*stride)= v;
yading@10 94 *(uint32_t*)(p + 4+1*stride)= v;
yading@10 95 if(h==2) return;
yading@10 96 *(uint32_t*)(p + 0+2*stride)= v;
yading@10 97 *(uint32_t*)(p + 4+2*stride)= v;
yading@10 98 *(uint32_t*)(p + 0+3*stride)= v;
yading@10 99 *(uint32_t*)(p + 4+3*stride)= v;
yading@10 100 }else if(w==16){
yading@10 101 *(uint32_t*)(p + 0+0*stride)= val;
yading@10 102 *(uint32_t*)(p + 4+0*stride)= val;
yading@10 103 *(uint32_t*)(p + 8+0*stride)= val;
yading@10 104 *(uint32_t*)(p +12+0*stride)= val;
yading@10 105 *(uint32_t*)(p + 0+1*stride)= val;
yading@10 106 *(uint32_t*)(p + 4+1*stride)= val;
yading@10 107 *(uint32_t*)(p + 8+1*stride)= val;
yading@10 108 *(uint32_t*)(p +12+1*stride)= val;
yading@10 109 if(h==2) return;
yading@10 110 *(uint32_t*)(p + 0+2*stride)= val;
yading@10 111 *(uint32_t*)(p + 4+2*stride)= val;
yading@10 112 *(uint32_t*)(p + 8+2*stride)= val;
yading@10 113 *(uint32_t*)(p +12+2*stride)= val;
yading@10 114 *(uint32_t*)(p + 0+3*stride)= val;
yading@10 115 *(uint32_t*)(p + 4+3*stride)= val;
yading@10 116 *(uint32_t*)(p + 8+3*stride)= val;
yading@10 117 *(uint32_t*)(p +12+3*stride)= val;
yading@10 118 #endif
yading@10 119 }else
yading@10 120 av_assert2(0);
yading@10 121 av_assert2(h==4);
yading@10 122 }
yading@10 123
yading@10 124 #endif /* AVCODEC_RECTANGLE_H */