Ejemplo n.º 1
0
/**
 * Read next object from buffer pointed by data. Notice that
 * no buffer overflow checks are done! This function always
 * expects to have 24 bytes available, which is the size of
 * the object header (GUID + data size)
 */
static void
asf_parse_read_object(asfint_object_t *obj, uint8_t *data)
{
	GetGUID(data, &obj->guid);
	obj->type = asf_guid_get_type(&obj->guid);
	obj->size = GetQWLE(data + 16);
	obj->full_data = data;
	obj->datalen = 0;
	obj->data = NULL;
	obj->next = NULL;

	if (obj->type == GUID_UNKNOWN) {
		debug_printf("unknown object: %x-%x-%x-%02x%02x%02x%02x%02x%02x%02x%02x, %ld bytes",
		             obj->guid.v1, obj->guid.v2, obj->guid.v3, obj->guid.v4[0],
		             obj->guid.v4[1], obj->guid.v4[2], obj->guid.v4[3], obj->guid.v4[4],
		             obj->guid.v4[5], obj->guid.v4[6], obj->guid.v4[7], (long) obj->size);
	}
}
Ejemplo n.º 2
0
/**
 * Read next object from buffer pointed by data. Notice that
 * no buffer overflow checks are done! This function always
 * expects to have 24 bytes available, which is the size of
 * the object header (GUID + data size)
 */
void ASFParser::asf_parse_read_object(asfint_object_t *obj, uint8_t *data) {
    if (!obj || !data) return;

    ASFByteIO::asf_byteio_getGUID(&obj->guid, data);
    obj->type = asf_guid_get_type(&obj->guid);
    obj->size = ASFByteIO::asf_byteio_getQWLE(data + 16);//8byte
    obj->full_data = data;
    obj->datalen = 0;
    obj->data = NULL;
    obj->next = NULL;

    if (obj->type == GUID_UNKNOWN) {
        ALOGE("unknown object: %x-%x-%x-%02x%02x%02x%02x%02x%02x%02x%02x, %ld bytes\n",
                obj->guid.v1, obj->guid.v2, obj->guid.v3, obj->guid.v4[0],
                obj->guid.v4[1], obj->guid.v4[2], obj->guid.v4[3], obj->guid.v4[4],
                obj->guid.v4[5], obj->guid.v4[6], obj->guid.v4[7], (long) obj->size);
        ALOGI("obj->type=%d,size=%lld,datalen=%lld\n", obj->type,obj->size,obj->datalen);
    }
}
Ejemplo n.º 3
0
static int
asf_parse_header_extended_stream_properties(asf_stream_t *stream,
                                            uint8_t *objdata,
                                            uint32_t objsize)
{
	asf_stream_extended_t ext;
	uint32_t datalen;
	uint8_t *data;
	uint16_t flags;
	int i;

	ext.start_time = asf_byteio_getQWLE(objdata);
	ext.end_time = asf_byteio_getQWLE(objdata + 8);
	ext.data_bitrate = asf_byteio_getDWLE(objdata + 16);
	ext.buffer_size = asf_byteio_getDWLE(objdata + 20);
	ext.initial_buf_fullness = asf_byteio_getDWLE(objdata + 24);
	ext.data_bitrate2 = asf_byteio_getDWLE(objdata + 28);
	ext.buffer_size2 = asf_byteio_getDWLE(objdata + 32);
	ext.initial_buf_fullness2 = asf_byteio_getDWLE(objdata + 36);
	ext.max_obj_size = asf_byteio_getDWLE(objdata + 40);
	ext.flags = asf_byteio_getDWLE(objdata + 44);
	ext.stream_num = asf_byteio_getWLE(objdata + 48);
	ext.lang_idx = asf_byteio_getWLE(objdata + 50);
	ext.avg_time_per_frame = asf_byteio_getQWLE(objdata + 52);
	ext.stream_name_count = asf_byteio_getWLE(objdata + 60);
	ext.num_payload_ext = asf_byteio_getWLE(objdata + 62);

	datalen = objsize - 88;
	data = objdata + 64;

	/* iterate through all name strings */
	for (i=0; i<ext.stream_name_count; i++) {
		uint16_t strlen;

		if (datalen < 4) {
			return ASF_ERROR_INVALID_VALUE;
		}

		strlen = asf_byteio_getWLE(data + 2);
		if (strlen > datalen) {
			return ASF_ERROR_INVALID_LENGTH;
		}

		/* skip the current name string */
		data += 4 + strlen;
		datalen -= 4 + strlen;
	}

	/* iterate through all extension systems */
	for (i=0; i<ext.num_payload_ext; i++) {
		uint32_t extsyslen;

		if (datalen < 22) {
			return ASF_ERROR_INVALID_VALUE;
		}

		extsyslen = asf_byteio_getDWLE(data + 18);
		if (extsyslen > datalen) {
			return ASF_ERROR_INVALID_LENGTH;
		}

		/* skip the current extension system */
		data += 22 + extsyslen;
		datalen -= 22 + extsyslen;
	}

	if (datalen > 0) {
		asf_guid_t guid;

		debug_printf("hidden stream properties object found!");

		/* this is almost same as in stream properties handler */
		if (datalen < 78) {
			return ASF_ERROR_OBJECT_SIZE;
		}

		/* check that we really have a stream properties object */
		asf_byteio_getGUID(&guid, data);
		if (asf_guid_get_type(&guid) != GUID_STREAM_PROPERTIES) {
			return ASF_ERROR_INVALID_OBJECT;
		}
		if (asf_byteio_getQWLE(data + 16) != datalen) {
			return ASF_ERROR_OBJECT_SIZE;
		}

		flags = asf_byteio_getWLE(data + 72);

		if ((flags & 0x7f) != ext.stream_num || stream->type) {
			/* only one stream object per stream allowed and
			 * stream ids have to match with both objects*/
			return ASF_ERROR_INVALID_OBJECT;
		} else {
			int ret;

			stream->flags |= ASF_STREAM_FLAG_HIDDEN;
			ret = asf_parse_header_stream_properties(stream,
								 data + 24,
								 datalen);

			if (ret < 0) {
				return ret;
			}
		}
	}

	stream->extended = malloc(sizeof(asf_stream_extended_t));
	if (!stream->extended) {
		return ASF_ERROR_OUTOFMEM;
	}
	stream->flags |= ASF_STREAM_FLAG_EXTENDED;
	memcpy(stream->extended, &ext, sizeof(ext));

	return 0;
}