2017-06-21 49 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