/** * Called via glGetBufferSubDataARB(). */ static void intel_bufferobj_get_subdata(GLcontext * ctx, GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid * data, struct gl_buffer_object *obj) { struct intel_buffer_object *intel_obj = intel_buffer_object(obj); assert(intel_obj); if (intel_obj->sys_buffer) memcpy(data, (char *)intel_obj->sys_buffer + offset, size); else dri_bo_get_subdata(intel_obj->buffer, offset, size, data); }
/* XXX: slice_data_bit_offset does not account for EPB */ unsigned int avc_get_first_mb_bit_offset_with_epb( dri_bo *slice_data_bo, VASliceParameterBufferH264 *slice_param, unsigned int mode_flag ) { unsigned int in_slice_data_bit_offset = slice_param->slice_data_bit_offset; unsigned int out_slice_data_bit_offset; unsigned int i, j, n, buf_size, data_size, header_size; uint8_t *buf; int ret; header_size = slice_param->slice_data_bit_offset / 8; data_size = slice_param->slice_data_size - slice_param->slice_data_offset; buf_size = (header_size * 3 + 1) / 2; // Max possible header size (x1.5) if (buf_size > data_size) buf_size = data_size; buf = alloca(buf_size); ret = dri_bo_get_subdata( slice_data_bo, slice_param->slice_data_offset, buf_size, buf ); assert(ret == 0); for (i = 2, j = 2, n = 0; i < buf_size && j < header_size; i++, j++) { if (buf[i] == 0x03 && buf[i - 1] == 0x00 && buf[i - 2] == 0x00) i += 2, j++, n++; } out_slice_data_bit_offset = in_slice_data_bit_offset + n * 8; if (mode_flag == ENTROPY_CABAC) out_slice_data_bit_offset = ALIGN(out_slice_data_bit_offset, 0x8); return out_slice_data_bit_offset; }