Logo Search packages:      
Sourcecode: blender version File versions

static int find_frame_end ( H264Context h,
const uint8_t *  buf,
int  buf_size 
) [static]

finds the end of the current frame in the bitstream.

Returns:
the position of the first byte of the next frame, or -1

Definition at line 7841 of file h264.c.

References MpegEncContext::parse_context, and H264Context::s.

                                                                           {
    int i;
    uint32_t state;
    ParseContext *pc = &(h->s.parse_context);
//printf("first %02X%02X%02X%02X\n", buf[0], buf[1],buf[2],buf[3]);
//    mb_addr= pc->mb_addr - 1;
    state= pc->state;
    for(i=0; i<=buf_size; i++){
        if((state&0xFFFFFF1F) == 0x101 || (state&0xFFFFFF1F) == 0x102 || (state&0xFFFFFF1F) == 0x105){
            tprintf("find_frame_end new startcode = %08x, frame_start_found = %d, pos = %d\n", state, pc->frame_start_found, i);
            if(pc->frame_start_found){
                // If there isn't one more byte in the buffer
                // the test on first_mb_in_slice cannot be done yet
                // do it at next call.
                if (i >= buf_size) break;
                if (buf[i] & 0x80) {
                    // first_mb_in_slice is 0, probably the first nal of a new
                    // slice
                    tprintf("find_frame_end frame_end_found, state = %08x, pos = %d\n", state, i);
                    pc->state=-1;
                    pc->frame_start_found= 0;
                    return i-4;
                }
            }
            pc->frame_start_found = 1;
        }
        if((state&0xFFFFFF1F) == 0x107 || (state&0xFFFFFF1F) == 0x108 || (state&0xFFFFFF1F) == 0x109){
           if(pc->frame_start_found){
                pc->state=-1;
                pc->frame_start_found= 0;
                return i-4;
           }
        }
        if (i<buf_size)
            state= (state<<8) | buf[i];
    }

    pc->state= state;
    return END_NOT_FOUND;
}


Generated by  Doxygen 1.6.0   Back to index