2015-05-09 3 views
0

Я пытаюсь записать память, которую я получаю из примера 4-го примера видеороликов. Однако он не работает. При попытке доступа к указателю я получаю ошибку сегментации. Надеюсь, это не глупая ошибка, потому что я потратил пару дней на это. Вот код: (Он не отформатирован, потому что было слишком много конфликтов с html.) Мой компьютер использует ветвь исполнения mmap. Он вызывает ошибки в writeFile(): mRGB = mScreen-> pixels [pixel];Видео 4 Linux 2 чтение MMAP-адрес

Я использую v4l2 пример кода, найденный здесь http://linuxtv.org/downloads/v4l-dvb-apis/capture-example.html

Вот изменения, которые я сделал:

в строке 497 я изменил

fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB332; 
fmt.fmt.pix.field = V4L2_FIELD_NONE; 

Я также добавил строку в основной (...) примерно на линии 704.

close_device(); 
writeFile(); 
fprintf(stderr, "\n"); 

и я вставил метод writeFile() указано ниже:

typedef struct Screen { 
    unsigned char pixels[640*480]; 
} Screen; 


static void writeFile() { 
    const int dimx = 640, dimy = 480; 
    int mNumPixels = dimx * dimy; 

    Screen *mScreen; 

    int i, pixel; 
    FILE *file = fopen("output","w"); 
    if (file == NULL) return; 
    /* shift the bits around */ 
    (void)fprintf(file, "P6\n%d %d\n255\n", dimx, dimy); 

    for (i = 1; i < n_buffers; i++) { 
    mScreen = buffers[i].start; 
    printf("\npointer to mScreen is: %p\n", mScreen); 

    for (pixel = 0; pixel < 640*480; pixel++) {  
     static unsigned char color[3]; 
     unsigned char mRGB = 0; 
     printf("%d:%x\n", pixel, mRGB); 
     fflush(stdout); 
     mRGB = mScreen->pixels[pixel]; 
     color[0] = (mRGB & 0xE0) >> 5; 
     color[1] = (mRGB & 0x1D) >> 2; 
     color[2] = mRGB & 0x03; 

     fwrite(color, sizeof(unsigned char)*3, 1, file); 
    } 
    } 
    fclose(file); 
} 
+0

Откуда у вас был указатель размером 2 символа ??? Попробуйте 'malloc (sizeof (char *))'. И вы никогда не освобождаете эту память. –

+0

@PaulOgilvie, что указатель явно никогда не используется, так что это утечка памяти, но это, вероятно, также отлаживает материал, на котором находится плакат. –

+0

Пиксельная петля не должна идти в 10, а в буферах [i] .length'. Я не могу найти определение «Экран». Убедитесь, что он определен как 'struct' с одним членом,' pixels', который является массивом 'unsigned char'. –

ответ

0

uninit_device() из примера кода изменяет доступную память таким образом, что указатель не доступен больше. Метод writeFile() должен быть вызван до этого метода/функции.

Смежные вопросы