1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
#include <stdlib.h>
#include "fileutils.h"
#include "generic.h"
#include "yazedc.h"
/*
From the SONY documentation:
32 bytes header:
StSTATUS : 2 bytes 0
StTYPE : 2 bytes 2
StSECTOR_OFFSET: 2 bytes 4
StSECTOR_SIZE : 2 bytes 6
StFRAME_NO : 4 bytes 10
StFRAME_SIZE : 4 bytes 14
StMOVIE_WIDTH : 2 bytes 16
StMOVIE_HEIGHT : 2 bytes 18
StMOVIE_HEADM : 4 bytes 22
StMOVIE_HEADV : 4 bytes 26
Channels : 2 bytes 30
*/
struct STR_Header {
Uint16 StSTATUS;
Uint16 StTYPE;
Uint16 StSECTOR_OFFSET;
Uint16 StSECTOR_SIZE;
Uint32 StFRAME_NO;
Uint32 StFRAME_SIZE;
Uint16 StMOVIE_WIDTH;
Uint16 StMOVIE_HEIGHT;
Uint32 StMOVIE_HEADM;
Uint32 StMOVIE_HEADV;
Uint16 Channels;
} __attribute__((packed));
Byte * video = 0, * audio = 0;
void process_one_sector(FILE * f) {
Byte sector[2336];
STR_Header * h;
fread(sector, 2336, 1, f);
h = (STR_Header *) ((Byte *) sector + 8);
printm(M_BARE, "SubHeader FN : %x\n", sector[0]);
printm(M_BARE, "SubHeader CN : %x\n", sector[1]);
printm(M_BARE, "SubHeader SM : %x\n", sector[2]);
printm(M_BARE, "SubHeader CI : %x\n", sector[3]);
if (sector[2] == 0x48) {
printm(M_BARE, "Video sector\n");
printm(M_BARE, "Status : %04x\n", h->StSTATUS);
printm(M_BARE, "Type : %04x\n", h->StTYPE);
printm(M_BARE, "Sector Offset: %i\n", h->StSECTOR_OFFSET);
printm(M_BARE, "Sector Size : %i\n", h->StSECTOR_SIZE);
printm(M_BARE, "Frame Number : %i\n", h->StFRAME_NO);
printm(M_BARE, "Frame Size : %i\n", h->StFRAME_SIZE);
printm(M_BARE, "Movie Width : %i\n", h->StMOVIE_WIDTH);
printm(M_BARE, "Movie Height : %i\n", h->StMOVIE_HEIGHT);
printm(M_BARE, "Movie HeadM : %08x\n", h->StMOVIE_HEADM);
printm(M_BARE, "Movie HeadV : %08x\n", h->StMOVIE_HEADV);
printm(M_BARE, "Channels : %04x\n", h->Channels);
if (h->StSECTOR_OFFSET == 0) {
video = (Byte *) malloc(h->StSECTOR_SIZE * 2016);
}
memcpy(video + h->StSECTOR_OFFSET * 2016, sector + 40);
} else if (sector[2] == 0x64) {
printm(M_BARE, "Audio sector\n");
} else {
printm(M_BARE, "Unknow sector\n");
}
printm(M_BARE, "---------------------------------\n\n");
}
#ifdef STR_MAIN
int main(void) {
while (!feof(stdin)) {
process_one_sector(stdin);
}
}
#endif
|