static int handle_block (mkv_demuxer_t *mkv_d, uint8_t *block, uint64_t length, uint64_t block_duration, int64_t block_bref, int64_t block_fref, uint8_t simpleblock) { int ii, num, tmp; mkv_track_t *track = NULL; int nRet = 1; /* first byte(s): track num */ num = ebml_read_vlen_uint (block, &tmp); // find track info for (ii=0; ii<mkv_d->num_tracks; ii++) { if ( (mkv_d->tracks[ii]->type == MATROSKA_TRACK_VIDEO) && (mkv_d->tracks[ii]->tnum == num) ) { track = mkv_d->tracks[ii]; break; } } if ( (track != NULL) && track->ms_compat && (track->private_data) && (track->hw_notsupport == 0) ) { BITMAP_INFO_HEADER *src; uint32_t biCompression; src = (BITMAP_INFO_HEADER *) track->private_data; biCompression = le2me_32 (src->biCompression); if ( (biCompression == mmioFOURCC('X', 'V', 'I', 'D')) || (biCompression == mmioFOURCC('x', 'v', 'i', 'd')) || (biCompression == mmioFOURCC('D', 'I', 'V', 'X')) || (biCompression == mmioFOURCC('d', 'i', 'v', 'x')) || (biCompression == mmioFOURCC('D', 'X', '5', '0')) ) { uint8_t *check_mp4_vol_buf = (uint8_t *)malloc(128); if (check_mp4_vol_buf != NULL) { memcpy(check_mp4_vol_buf, block, 128); if ( !check_mp4_header_vol(check_mp4_vol_buf, 128) ) { printf("\nMKV: GMC AND STATIC SPRITE CODING not supported\n\n"); track->hw_notsupport = 1; nRet = 0; } free(check_mp4_vol_buf); } } } return nRet; }
/* * Read a variable length signed int. */ int64_t ebml_read_vlen_int(bstr *buffer) { uint64_t unum; int l; /* read as unsigned number first */ size_t len = buffer->len; unum = ebml_read_vlen_uint(buffer); if (unum == EBML_UINT_INVALID) return EBML_INT_INVALID; l = len - buffer->len; return unum - ((1 << ((7 * l) - 1)) - 1); }
/* * Read a variable length signed int. */ int64_t ebml_read_vlen_int(uint8_t *buffer, int *length) { uint64_t unum; int l; /* read as unsigned number first */ unum = ebml_read_vlen_uint(buffer, &l); if (unum == EBML_UINT_INVALID) return EBML_INT_INVALID; if (length) *length = l; return unum - ((1 << ((7 * l) - 1)) - 1); }