コード例 #1
0
static int _decode_interactive_composition(BITBUFFER *bb, BD_IG_INTERACTIVE_COMPOSITION *p)
{
    unsigned ii;

    uint32_t data_len = bb_read(bb, 24);
    uint32_t buf_len  = bb->p_end - bb->p;
    if (data_len != buf_len) {
        ERROR("ig_decode_interactive(): buffer size mismatch (expected %d, have %d)\n", data_len, buf_len);
        return 0;
    }

    p->stream_model = bb_read(bb, 1);
    p->ui_model     = bb_read(bb, 1);
    bb_skip(bb, 6);

    if (p->stream_model == 0) {
        bb_skip(bb, 7);
        p->composition_timeout_pts = bb_read_u64(bb, 33);
        bb_skip(bb, 7);
        p->selection_timeout_pts = bb_read_u64(bb, 33);
    }

    p->user_timeout_duration = bb_read(bb, 24);

    p->num_pages = bb_read(bb, 8);
    p->page      = calloc(p->num_pages, sizeof(BD_IG_PAGE));

    for (ii = 0; ii < p->num_pages; ii++) {
        _decode_page(bb, &p->page[ii]);
    }

  return 1;
}
コード例 #2
0
ファイル: ig_decode.c プロジェクト: DaveDaCoda/mythtv
static int _decode_button(BITBUFFER *bb, BD_IG_BUTTON *p)
{
    unsigned ii;

    p->id                   = bb_read(bb, 16);

    p->numeric_select_value = bb_read(bb, 16);
    p->auto_action_flag     = bb_read(bb, 1);
    bb_skip(bb, 7);

    p->x_pos                = bb_read(bb, 16);
    p->y_pos                = bb_read(bb, 16);

    p->upper_button_id_ref  = bb_read(bb, 16);
    p->lower_button_id_ref  = bb_read(bb, 16);
    p->left_button_id_ref   = bb_read(bb, 16);
    p->right_button_id_ref  = bb_read(bb, 16);

    p->normal_start_object_id_ref    = bb_read(bb, 16);
    p->normal_end_object_id_ref      = bb_read(bb, 16);
    p->normal_repeat_flag            = bb_read(bb, 1);
    bb_skip(bb, 7);

    p->selected_sound_id_ref         = bb_read(bb, 8);
    p->selected_start_object_id_ref  = bb_read(bb, 16);
    p->selected_end_object_id_ref    = bb_read(bb, 16);
    p->selected_repeat_flag          = bb_read(bb, 1);
    bb_skip(bb, 7);

    p->activated_sound_id_ref        = bb_read(bb, 8);
    p->activated_start_object_id_ref = bb_read(bb, 16);
    p->activated_end_object_id_ref   = bb_read(bb, 16);

    p->num_nav_cmds = bb_read(bb, 16);
    p->nav_cmds     = calloc(p->num_nav_cmds, sizeof(MOBJ_CMD));
    if (!p->nav_cmds) {
        BD_DEBUG(DBG_DECODE | DBG_CRIT, "out of memory\n");
        return 0;
    }

    for (ii = 0; ii < p->num_nav_cmds; ii++) {
        uint8_t buf[12];
        bb_read_bytes(bb, buf, 12);

        mobj_parse_cmd(buf, &p->nav_cmds[ii]);
    }

    return 1;
}
コード例 #3
0
ファイル: pg_decode.c プロジェクト: hongxchen/RTPServer
void pg_decode_video_descriptor(BITBUFFER *bb, BD_PG_VIDEO_DESCRIPTOR *p)
{
    p->video_width  = bb_read(bb, 16);
    p->video_height = bb_read(bb, 16);
    p->frame_rate   = bb_read(bb, 4);
    bb_skip(bb, 4);
}
コード例 #4
0
ファイル: mobj_parse.c プロジェクト: rogerjames99/mythtv
void mobj_parse_cmd(uint8_t *buf, MOBJ_CMD *cmd)
{
    BITBUFFER bb;
    bb_init(&bb, buf, 12);

    cmd->insn.op_cnt     = bb_read(&bb, 3);
    cmd->insn.grp        = bb_read(&bb, 2);
    cmd->insn.sub_grp    = bb_read(&bb, 3);

    cmd->insn.imm_op1    = bb_read(&bb, 1);
    cmd->insn.imm_op2    = bb_read(&bb, 1);
    bb_skip(&bb, 2);    /* reserved */
    cmd->insn.branch_opt = bb_read(&bb, 4);

    bb_skip(&bb, 4);    /* reserved */
    cmd->insn.cmp_opt    = bb_read(&bb, 4);

    bb_skip(&bb, 3);    /* reserved */
    cmd->insn.set_opt    = bb_read(&bb, 5);

    cmd->dst = bb_read(&bb, 32);
    cmd->src = bb_read(&bb, 32);
}
コード例 #5
0
ファイル: fat.c プロジェクト: RamseyK/dd_reader
void fat_read_partition(byte_buffer *bb, fat_partition *part) {
	// Keep the byte address of the start of the partiton
	part->start_pos = bb->pos;

	// Boot sector
	fat_read_boot_sector(bb, part);
	
	// FAT32: Jump to FSINFO and read it
	if(part->type == PT_FAT32) {
		// Boot sector is always at sector 0 so skip to the relative sector offset of the FSINFO
		// We subtract 1 from the fsinfo_sector to account for the boot sector ("first sector")
		bb_skip(bb, part->boot_sector->bpb.bytes_per_sector * (part->boot_sector->bpb.fsinfo_sector_f32 - 1));
		fat_read_fsinfo(bb, part);
	}

	// Move to the start of the FAT tables
	bb->pos = part->start_pos + (part->boot_sector->bpb.reserved_sectors * part->boot_sector->bpb.bytes_per_sector);
}
コード例 #6
0
ファイル: pg_decode.c プロジェクト: hongxchen/RTPServer
void pg_decode_composition_object(BITBUFFER *bb, BD_PG_COMPOSITION_OBJECT *p)
{
    p->object_id_ref = bb_read(bb, 16);
    p->window_id_ref = bb_read(bb, 8);

    p->crop_flag      = bb_read(bb, 1);
    p->forced_on_flag = bb_read(bb, 1);
    bb_skip(bb, 6);

    p->x = bb_read(bb, 16);
    p->y = bb_read(bb, 16);

    if (p->crop_flag) {
        p->crop_x = bb_read(bb, 16);
        p->crop_y = bb_read(bb, 16);
        p->crop_w = bb_read(bb, 16);
        p->crop_h = bb_read(bb, 16);
    }
}
コード例 #7
0
ファイル: pg_decode.c プロジェクト: hongxchen/RTPServer
int pg_decode_composition(BITBUFFER *bb, BD_PG_COMPOSITION *p)
{
    unsigned ii;

    pg_decode_video_descriptor(bb, &p->video_descriptor);
    pg_decode_composition_descriptor(bb, &p->composition_descriptor);

    p->palette_update_flag = bb_read(bb, 1);
    bb_skip(bb, 7);

    p->palette_id_ref      = bb_read(bb, 8);

    p->num_composition_objects = bb_read(bb, 8);
    p->composition_object      = calloc(p->num_composition_objects, sizeof(BD_PG_COMPOSITION_OBJECT));

    for (ii = 0; ii < p->num_composition_objects; ii++) {
        pg_decode_composition_object(bb, &p->composition_object[ii]);
    }

    return 1;
}
コード例 #8
0
ファイル: pg_decode.c プロジェクト: hongxchen/RTPServer
void pg_decode_sequence_descriptor(BITBUFFER *bb, BD_PG_SEQUENCE_DESCRIPTOR *p)
{
    p->first_in_seq = bb_read(bb, 1);
    p->last_in_seq  = bb_read(bb, 1);
    bb_skip(bb, 6);
}
コード例 #9
0
ファイル: pg_decode.c プロジェクト: hongxchen/RTPServer
void pg_decode_composition_descriptor(BITBUFFER *bb, BD_PG_COMPOSITION_DESCRIPTOR *p)
{
    p->number = bb_read(bb, 16);
    p->state  = bb_read(bb, 2);
    bb_skip(bb, 6);
}
コード例 #10
0
ファイル: fat.c プロジェクト: RamseyK/dd_reader
/*
 * Read's the FAT volume boot record in the byte buffer and sets the relevant information in the partition structure's boot_sector
 */
void fat_read_boot_sector(byte_buffer *bb, fat_partition *part) {
	part->boot_sector = fat_new_boot_sector();
	fat_bs *bs = part->boot_sector;

	// Jump instruction
	bb_get_bytes_in(bb, bs->jmp, sizeof(bs->jmp));

	// OEM ID string
	bb_get_bytes_in(bb, bs->oem_id, sizeof(bs->oem_id));

	// BPB
	bs->bpb.bytes_per_sector = bb_get_short(bb);
	bs->bpb.sectors_per_cluster = bb_get(bb);
	bs->bpb.reserved_sectors = bb_get_short(bb);
	bs->bpb.num_fats = bb_get(bb);
	bs->bpb.root_entries_f16 = bb_get_short(bb);
	bs->bpb.total_sectors_16bit = bb_get_short(bb);
	bs->bpb.media_descriptor = bb_get(bb);
	bs->bpb.sectors_per_fat_f16 = bb_get_short(bb);
	bs->bpb.sectors_per_track = bb_get_short(bb);
	bs->bpb.num_heads = bb_get_short(bb);
	bs->bpb.hidden_sectors = bb_get_int(bb);
	bs->bpb.total_sectors_32bit = bb_get_int(bb);

	// Make proper determination of the FAT partition type according to MSFT docs
	uint32_t cluster_count = fat_count_clusters(part);
	if(cluster_count < 4085) {
		part->type = PT_FAT12;
	} else if(cluster_count < 65525) {
		part->type = PT_FAT16B;
	} else {
		part->type = PT_FAT32;
	}
	//printf("Detected FAT type: %s\n", get_partition_str(part->type)); // delete this after testing

	// FAT32 portion of the BPB
	if(part->type == PT_FAT32) {
		bs->bpb.sectors_per_fat_f32 = bb_get_int(bb);
		bs->bpb.eflags_f32 = bb_get_short(bb);
		bs->bpb.version_f32 = bb_get_short(bb);
		bs->bpb.root_cluster_f32 = bb_get_int(bb);
		bs->bpb.fsinfo_sector_f32 = bb_get_short(bb);
		bs->bpb.backup_sector_f32 = bb_get_short(bb);
		bb_skip(bb, sizeof(bs->bpb.reserved_f32)); // Skip 12 byte reserved
	}

	// EBPB
	bs->ebpb.physical_drive_num = bb_get(bb);
	bs->ebpb.reserved = bb_get(bb);
	bs->ebpb.eb_sig = bb_get(bb);
	bs->ebpb.volume_serial = bb_get_int(bb);
	bb_get_bytes_in(bb, bs->ebpb.volume_label, sizeof(bs->ebpb.volume_label));
	bb_get_bytes_in(bb, bs->ebpb.system_id, sizeof(bs->ebpb.system_id));

	// Bootstrap code
	if(part->type == PT_FAT32) {
		bs->bootstrap_code = bb_get_bytes(bb, FAT32_BOOTSTRAP_SIZE);
	} else {
		bs->bootstrap_code = bb_get_bytes(bb, FAT16_BOOTSTRAP_SIZE);
	}

	// End signature
	bs->sig_end1 = bb_get(bb);
	bs->sig_end2 = bb_get(bb);
	if(bs->sig_end1 != 0x55 || bs->sig_end2 != 0xAA) {
		printf("Warning: FAT VBR boot signature does not match 0x55 0xAA!. sig1: %X, sig2: %X\n", bs->sig_end1, bs->sig_end2);
	}
}