2017-06-21 32 views
0

几乎无处不在我看去,srcSliceY值设置为0 在它wrriten文档:中的ffmpeg库sws_scale功能srcSliceY参数

c   the scaling context previously created with sws_getContext() 
srcSlice the array containing the pointers to the planes of the source slice 
srcStride the array containing the strides for each plane of the source image 
srcSliceY the position in the source image of the slice to process, that is the number (counted starting from zero) in the image of the first row of the slice 
... 

据我不清楚这是什么意思“了源图像“。这是否意味着源片?没有称为“源图像”的参数。

我写了这个代码:

SwsContext *ctx = sws_getContext(width, height, AV_PIX_FMT_GRAY8, 
             dwidth, dheight, AV_PIX_FMT_GRAY8, 
             SWS_BILINEAR, NULL, NULL, NULL); 


const uint8_t* srcSlice[1] = { pSrc}; 
const int srcStride[1] = { width }; 
int srcSliceH = height; 
const int dstStride[1] = { dwidth }; 

printf("srcStride=%d, height =%d\n",srcStride[0],srcSliceH); 
for(int i=0;i<100;i++){ 
    int t = sws_scale(ctx, srcSlice, srcStride, i, srcSliceH, &pDst, dstStride); 
    if(t != 0) 
    printf("i=%d t= %d\n",i,t); 
} 

我得到的输出:

srcStride=384, height =30 
[swscaler @ 0x1b0ba60] Warning: data is not aligned! This can lead to a speedloss 
i=0 t= 2 
i=4 t= 1 
i=14 t= 1 
i=24 t= 1 
i=33 t= 1 
i=43 t= 1 
i=52 t= 1 
i=62 t= 1 
i=72 t= 1 
i=81 t= 1 
i=91 t= 1 

望着sws_scale的源代码,它在错误或无效的输入返回0。所以我得出结论:对于迭代中的srcSliceY的大部分值,sws_returns错误。但目前尚不清楚什么是有效的。

回答

0

所以在做了一些更多的实验之后,我想我已经找到了答案。 和srcSliceH参数sws_scale应该总计为srcH参数sws_getContext

然后sws_scale保持dstH : srcH参数sws_getContext决定输出切片的高度。使得如果dhsws_scale的返回值,则:

dstH : srcH〜= dh : srcSliceH

所以,以下代码:

int sws_scale_test(){ 

    int srcW = 1000; 
    int srcH = 1000; 
    int dstW = 2000; 
    int dstH = 3000; 

    unsigned char* pSrc = (unsigned char*)malloc(srcW*srcH); 
    unsigned char* pDst = (unsigned char*)malloc(dstW*dstH); 

    SwsContext *ctx = sws_getContext(srcW,srcH, AV_PIX_FMT_GRAY8, dstW,dstH, AV_PIX_FMT_GRAY8, NULL, NULL, NULL, NULL); 

    const uint8_t* srcSlice[4] = { pSrc,NULL,NULL,NULL}; 
    const int srcStride[4] = { srcW,0,0,0 }; 
    int srcSliceY = 0; 

    uint8_t* dst[4] = { pDst,NULL,NULL,NULL }; 
    const int dstStride[4] = { dstW,0,0,0}; 

    printf("dstH/srcH = %f\n",((double)dstH)/ ((double)srcH) ); 

    for(int i=1;srcH>i;i = 2*i){ 
    int srcSliceH = srcH-i; 
    int dh = sws_scale(ctx, srcSlice, srcStride, i, srcSliceH, dst, dstStride); 
    if(dh != 0) 
     printf(" dt/srcH = %f\n",i,srcSliceH,dh, ((double)dh)/((double) (srcSliceH)));  
    } 
    return 0; 
} 

打印:

dstH/srcH = 3.000000 
dt/srcH = 2.994995 
dt/srcH = 2.994990 
dt/srcH = 2.994980 
dt/srcH = 2.994960 
dt/srcH = 2.994919 
dt/srcH = 2.994835 
dt/srcH = 2.994658 
dt/srcH = 2.994266 
dt/srcH = 2.993280 
dt/srcH = 2.989754