2015-10-06 62 views
1

我正在嘗試爲圖像處理例程創建一組gstreamer插件。我已成功創建了一個將圖像和元數據讀入GstBuffer的源元素,以及將緩衝區中的數據(隨附元數據)寫入磁盤的接收器元素。我已經成功測試了這些,並實現了所需的輸出(與沒有過濾器的輸入相同)。無法更改GstBuffer中的數據

我也創建了一個拉伸元素,它利用外部庫來填充可用的動態範圍(即,每個像素只能使用12位的16位圖像可以被拉伸以填充整個16位可用) 。

如果我只是在Stretch元素的srcpad上推送未更改的緩衝區,我就會得到我所期望的(未改變的圖像)。但是,如果我嘗試對緩衝區中的數據執行任何類型的操作,則緩衝區中的數據將設置爲0。

這裏是我的拉伸插件目前執行的鏈()函數:

static GstFlowReturn 
gst_stretching_chain(GstPad *pad, GstObject *parent, GstBuffer *buf) 
{ 
    GstStretching *filter; 
    filter = GST_STRETCHING(parent); 

    g_print("Stretching...\n"); 

    guint num_rows; 
    g_object_get(G_OBJECT(parent), "num_rows", &num_rows, NULL); 

    guint num_cols; 
    g_object_get(G_OBJECT(parent), "num_cols", &num_cols, NULL); 

    guint bit_depth; 
    g_object_get(G_OBJECT(parent), "bit_depth", &bit_depth, NULL); 

    guint sig_bits; 
    g_object_get(G_OBJECT(parent), "sig_bits", &sig_bits, NULL); 

    gchar *product; 
    g_object_get(G_OBJECT(parent), "product", &product, NULL); 

    GstMapInfo info_in; 
    gst_buffer_map(buf, &info_in, GST_MAP_WRITE); 
    guint8 *in = info_in.data; 

    GstMemory *mem; 
    mem = gst_allocator_alloc(NULL, num_rows*num_cols*bit_depth/8, NULL); 

    GstMapInfo info_out; 
    gst_memory_map(mem, &info_out, GST_MAP_WRITE); 
    guint8 *out = info_out.data; 

    float *rad_gain[4] = {NULL, NULL, NULL, NULL}; 
    float *rad_offset[4] = {NULL, NULL, NULL, NULL}; 

    StretchingImage((unsigned short int *)in, num_rows, num_cols, sig_bits, 
     bit_depth, rad_gain, rad_offset, 0, product, (unsigned short int *)out); 

    gst_buffer_unmap(buf, &info_in); 

    gst_buffer_replace_all_memory(buf, mem); 

    return gst_pad_push(filter->srcpad, buf); 
} 

當這個沒有工作,我也試過手動(數據的簡單變化,看看我是否會得到預期的輸出):

static GstFlowReturn 
gst_stretching_chain(GstPad *pad, GstObject *parent, GstBuffer *buf) 
{ 
    GstStretching *filter; 
    filter = GST_STRETCHING(parent); 

    g_print("Stretching...\n"); 

    guint num_rows; 
    g_object_get(G_OBJECT(parent), "num_rows", &num_rows, NULL); 

    guint num_cols; 
    g_object_get(G_OBJECT(parent), "num_cols", &num_cols, NULL); 

    guint bit_depth; 
    g_object_get(G_OBJECT(parent), "bit_depth", &bit_depth, NULL); 

    guint sig_bits; 
    g_object_get(G_OBJECT(parent), "sig_bits", &sig_bits, NULL); 

    gchar *product; 
    g_object_get(G_OBJECT(parent), "product", &product, NULL); 

    GstMapInfo info_in; 
    gst_buffer_map(buf, &info_in, GST_MAP_WRITE); 
    guint8 *in = info_in.data; 

    GstMemory *mem; 
    mem = gst_allocator_alloc(NULL, num_rows*num_cols*bit_depth/8, NULL); 

    GstMapInfo info_out; 
    gst_memory_map(mem, &info_out, GST_MAP_WRITE); 
    guint8 *out = info_out.data; 

    int i; 
    for (i=0; i<num_rows*num_cols*bit_depth/8; i++) { 
    out[i] = 255; 
    } 

    float *rad_gain[4] = {NULL, NULL, NULL, NULL}; 
    float *rad_offset[4] = {NULL, NULL, NULL, NULL}; 

    StretchingImage((unsigned short int *)in, num_rows, num_cols, sig_bits, 
     bit_depth, rad_gain, rad_offset, 0, product, (unsigned short int *)out); 

    gst_buffer_unmap(buf, &info_in); 

    gst_buffer_replace_all_memory(buf, mem); 

    return gst_pad_push(filter->srcpad, buf); 
} 

即使這樣,我仍然獲得所有0的時候,我檢查輸出。我假設我在嘗試訪問緩衝區中的數據時做錯了什麼,但還沒有弄清楚它可能是什麼。有任何想法嗎?

回答

1

gst_buffer_map(buf, &info_in, GST_MAP_WRITE); 應該 gst_buffer_map(buf, &info_in, GST_MAP_READ);

此外僅供參考,您可以simplfy代碼

guint num_rows, num_cols, ...; 

g_object_get(G_OBJECT(parent), 
    "num_rows", &num_rows, 
    "num_cols", &num_cols, 
    ... 
    NULL);