Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: ebml.c Projeto: AppleNuts/mpv
/*
 * 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);
}
Exemplo n.º 3
0
Arquivo: ebml.c Projeto: kax4/mpv
/*
 * 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);
}