OpenGL ES glReadPixels exc_bad_access - PullRequest
       23

OpenGL ES glReadPixels exc_bad_access

1 голос
/ 29 ноября 2011

Я пытаюсь создать видео из изображений, используя OpenGL ES и ffmpeg, но на iPad (4.3) у меня происходит сбой на glReadPixels

-(NSData *) glToUIImage {

    int numberOfComponents = NUMBER_OF_COMPONENTS; //4
    int width = PICTURE_WIDTH; 
    int height = PICTURE_HEIGHT;

    NSInteger myDataLength = width * height * numberOfComponents;   

    NSMutableData * buffer= [NSMutableData dataWithLength :myDataLength];    

    [self checkForGLError]; 

    GLenum type = NUMBER_OF_COMPONENTS == 3 ? GL_RGB : GL_RGBA; //RGBA
    glReadPixels(0, 0, width, height, type, GL_UNSIGNED_BYTE, [buffer mutableBytes]);   //EXC_BAD_ACCESS here

    return buffer; 
}

Он работает на iPhone 4 (4.3) и iPod Touch, но имеет проблемы с iPhone 3G (3.0) и iPad (4.3). Можете ли вы помочь мне с этим вопросом?

Также на iPhone 3G (3.0) и iPad (4.3) у меня проблемы с видео - первые 5-20 видеокадров имеют мусор. Может быть проблема с оптимизацией? Или архитектура?

EDITED Стек:

#0  0x33be3964 in void BlockNxN<64ul, 16ul, 1, BLOCK_CONVERTER_NULL_32>(unsigned long, int, int, unsigned long, int, int, unsigned int, unsigned int, unsigned int, unsigned int) ()
#1  0x33be1c76 in glrBIFDetile ()
#2  0x33b586b2 in sgxGetImage(SGXImageReadParams const*) ()
#3  0x33b50d38 in gldReadPixels ()
#4  0x31813e16 in glReadPixels_Exec ()
#5  0x31e3c518 in glReadPixels ()

1 Ответ

2 голосов
/ 06 декабря 2011

Я разобрался !!!

Я исправляю эту проблему около двух недель.

Вы должны позвонить glReadPixels() до [(EAGLView *)eagleView presentFramebuffer];

И поэтому вы должны связать colorRenderbuffer, прежде чем будете читать пиксели. Окончательный список методов:

int numberOfComponents = NUMBER_OF_COMPONENTS;
int width = PICTURE_WIDTH;
int height = PICTURE_HEIGHT;

NSInteger myDataLength = width * height * numberOfComponents; 


NSMutableData * buffer= [NSMutableData dataWithLength :myDataLength];
glBindRenderbuffer(GL_RENDERBUFFER_OES, [((EAGLView *)eagleView) colorRenderbuffer]);
[self checkForGLError];
glPixelStorei(GL_PACK_ALIGNMENT, 4); // force 4 byte alignment

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, [buffer mutableBytes]);
return buffer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...