source: svn/zas_dstar/candidates/bin2ts.cpp @ 26

Last change on this file since 26 was 26, checked in by phkim, 11 years ago
  1. phkim
  2. 서경방소에서 kctv 로고 변경
File size: 5.8 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <memory.h>
4
5static unsigned int  DHL_PsiAPI_CalculateCRC(const unsigned char *data, unsigned int len)
6{
7        static unsigned int crcTable[256];
8        static bool bFirst=true;
9        if (bFirst)
10        {
11                bFirst = false;
12                for (int i=0; i<256; i++) {
13                        unsigned int crc = 0;
14                        for (int j=7; j>=0; j--) {
15                                if (((i >> j) ^ (crc >> 31)) & 1) crc=(crc<<1)^0x04C11DB7;
16                                else crc<<=1;
17                        }
18                        crcTable[i] = crc;
19                }
20        }
21        unsigned int crc = 0xFFFFFFFF;
22        for (int i = 0; i < len; ++i) crc = (crc << 8) ^ crcTable[(crc >> 24) ^ (*data++)];
23        return crc;
24}
25
26int main(int argc, char* argv[])
27{
28        // ÀÔ·Â ÀÎÀÚ °¹¼ö È®ÀÎ
29        if (argc != 5)
30        {
31                printf("%s ModelName VersionName FileName\n", argv[0]);
32                return -1;
33        }
34       
35        // ÀÔ·Â ÆÄÀÏÀÌ Á¸ÀçÇÏ´Â Áö È®ÀÎ
36        FILE *fp = fopen(argv[3],"rb");
37        if (fp == 0)
38        {
39                printf("%s ModelName VersionName FileName\n", argv[0]);
40                printf("Can not find file %s\n", argv[3]);
41                return -2;
42        }
43       
44        // ÀÔ·Â ÆÄÀÏÀÇ ±æÀÌ È®ÀÎ
45        fseek(fp, 0L, SEEK_END);
46        int nFileSize = ftell(fp);
47        if (nFileSize == 0)
48        {
49                printf("%s ModelName VersionName FileName\n", argv[0]);
50                printf("Can not find file %s\n", argv[1]);
51                printf("File Size is Zero\n");
52                return -3;
53        }
54       
55        // ÀÔ·Â ÆÄÀÏÀ» ÀÐ¾î µéÀÓ
56        fseek(fp, 0L, SEEK_SET);
57        unsigned char *data = (unsigned char*)malloc(nFileSize);
58        if (data == 0)
59        {
60                printf("%s ModelName VersionName FileName\n", argv[0]);
61                printf("Can not find file %s\n", argv[1]);
62                printf("Out of Memory\n");
63                fclose(fp);
64                return -4;
65        }
66        fread( data, 1, nFileSize, fp);
67        fclose(fp);
68       
69        // Á¤º¸ ±¸Á¶Ã¼
70        struct INFO
71        {
72                char strModelName[10]; //Á¦Ç°¸ðµ¨¸í
73                char strVersionName[8]; // S/W ¹öÀü
74                char strFileSize[8]; // Àüü ÆÄÀÏ ±æÀÌ
75                char strPosition[8]; // µ¥ÀÌÅÍÀÇ ½ÃÀÛ À§Ä¡
76                char strLength[8]; // µ¥ÀÌÅÍÀÇ ±æÀÌ
77                char strMaxBlockNumber[8]; // ¸¶Áö¸· ºí·° ¹øÈ£
78                char strBlockNumber[8]; // ¸î¹øÂ° ºí·°ÀÎÁö 0ºÎÅÍ ½ÃÀÛ
79        } info;
80       
81        memset(&info, 0, sizeof(info));
82       
83        // ±¸Á¶Ã¼¿¡ ¸ðµ¨À̸§ º¹»ç
84        int maxLen = strlen(argv[1]);
85        if (maxLen > 9) maxLen = 9;
86        memcpy(info.strModelName, argv[1], maxLen);
87       
88        // ±¸Á¶Ã¼¿¡ ¹öÀüÀ̸§ º¹»ç
89        maxLen = strlen(argv[2]);
90        if (maxLen > 7) maxLen = 7;
91        memcpy(info.strVersionName, argv[2], maxLen);
92#if 1
93        // CMB¿¡ ƯȭµÈ ¹öÀü À̸§ Ç¥±â 1.0.00
94        // DST_Main.cppÀÇ ¹öÀü ±ÔÄ¢°ú ÀÏÄ¡½ÃÄÑ¾ß ÇÑ´Ù.
95        sprintf(info.strVersionName, "%d.%d.%d", 
96                atoi(argv[2])/1000, 
97                (atoi(argv[2])%1000)/100, 
98                (atoi(argv[2])%1000)%100);
99        printf("VERSION : %s\n", info.strVersionName);
100#endif
101        // ±¸Á¶Ã¼¿¡ ÆÄÀÏ ±æÀÌ º¹»ç
102        sprintf(info.strFileSize, "%d", nFileSize); 
103       
104        //Ãâ·Â ÆÄÀÏ »ý¼º ÀÔ·ÂÆÄÀÏÀ§¿¡ .ts Ãß°¡
105        //char strOutFileName[4096];
106        //sprintf(strOutFileName, "%s.ts", argv[3]);
107        fp = fopen(argv[4], "wb");
108       
109        // ÇÑ ÆÐŶ¿¡ µé¾î°¥ ¼ø¼öÇÑ µ¥ÀÌÅÍÀÇ ÃÖ´ë ±æÀ̸¦ °è»ê
110        int packet_length = 4031+17;
111        int max_data_length = packet_length - 9 - sizeof(info) - 4; //total - header - private header - crc
112
113        // ±¸Á¶Ã¼¿¡ °¡Àå Å« ºí·°¹øÈ£ °è»ê
114        int nMaxBlockNumber =  (nFileSize -1)  / max_data_length;
115        sprintf(info.strMaxBlockNumber, "%d", nMaxBlockNumber); 
116       
117        for (int k = 0; k < 2; k++) // ½ºÆ®¸² Á¦³Ê·¹ÀÌÅÍ¿¡¼­ Wrap around ½Ã ºüÁú°ÍÀ» °í·ÁÇÏ¿© 2¹ÙÄû µ¹¸°´Ù.
118        {       
119                int nBlockNumber = 0; // ÇöÀç ºí·° ¹øÈ£
120                for (int nPosition = 0; nPosition < nFileSize; nPosition += max_data_length)
121                {
122                        // ±¸Á¶Ã¼¿¡ ÆÄÀÏ»ó À§Ä¡ ÀúÀå
123                        sprintf(info.strPosition, "%d", nPosition); 
124                       
125                        // ±¸Á¶Ã¼¿¡ Çö ºí·°¹øÈ£  ÀúÀå
126                        sprintf(info.strBlockNumber, "%d", nBlockNumber); 
127                       
128                        // ÀúÀåÇÒ µ¥ÀÌÅÍ ±æÀÌ
129                        int nLength = (nPosition + max_data_length >= nFileSize) ? nFileSize - nPosition : max_data_length;
130                        sprintf(info.strLength, "%d", nLength); 
131                       
132                        //printf("nLength = %d\n", nLength);
133                        //printf("max_data_length = %d\n", max_data_length);
134                       
135                        unsigned char section[5000];
136                        memset(section, 0xFF, 5000);
137                        int nPos = 0; // ¹è¿­³»ÀÇ ÇöÀç À§Ä¡
138                        section[nPos++] = 0x00; 
139                        section[nPos++] = 0xF5; // table id
140                        section[nPos++] = 0xF0 + ((packet_length - 4)/256); // section syntax indicator
141                        section[nPos++] = (packet_length - 4) % 256; // length
142                        section[nPos++] = 0x00; 
143                        section[nPos++] = 0x01;
144                        section[nPos++] = 0xC1;
145                        section[nPos++] = nPosition & 0xFF;
146                        section[nPos++] = 0xFF;
147                       
148                        int nLen = (section[2] & 0xF)*256 + section[3];
149                        // Á¤º¸ º¹»ç
150                        memcpy(&section[nPos], &info, sizeof(info));
151                        nPos += sizeof(info);
152                       
153                        // µ¥ÀÌÅÍ º¹»ç
154                        memcpy(&section[nPos], &data[nPosition], nLength);
155                       
156                        // CRC »ðÀÔ
157                        unsigned int crc = DHL_PsiAPI_CalculateCRC(&section[1], nLen-1);
158                       
159                        section[nLen+0] = (crc >> 24) & 0xFF;
160                        section[nLen+1] = (crc >> 16) & 0xFF;
161                        section[nLen+2] = (crc >> 8) & 0xFF;
162                        section[nLen+3] = (crc) & 0xFF; 
163                       
164                        int nSectionLength = nLen;
165                        for (int i = 0; i <  nSectionLength; i+= 184) // 188¿¡¼­ header 4¹ÙÀÌÆ® Á¦°Å
166                        {
167                                unsigned char packet[188];
168                                memset(packet, 0xFF, 188);
169                                int nPos = 0; // ¹è¿­³»ÀÇ ÇöÀç À§Ä¡
170                                packet[nPos++] = 0x47; //Sync
171                                packet[nPos++] = (i==0) ? 0x5F : 0x1F; // payload unit start indicator + 0x1FF5
172                                packet[nPos++] = 0xF5; // pid 0x1FF5
173                                static int continuity_counter = 0;
174                                packet[nPos++] = 0x10 + ((continuity_counter++)%16); // Adaptation field control + continuity counter
175                                // µ¥ÀÌÅÍ º¹»ç
176                                memcpy(&packet[nPos], &section[i], 184);
177                                fwrite(packet, 1, 188, fp); // ÆÄÀÏ ÀúÀå
178                        }
179                        // printf("i = %d data_length = %d packet[3] = 0x%02X\n", i, data_length, packet[3]);
180                        unsigned char packet[188];
181                        memset(packet, 0x00, 188);
182                        packet[0] = 0x47; //Sync
183                        packet[1] = 0x1F;
184                        packet[2] = 0xFF;
185                        packet[3] = 0x10;
186                        for ( int i = 0; i < 100; i++) // ½ºÆ®¸² Á¦³Ê·¹ÀÌÅÍ Æ¯¼º¿¡ µû¶ó Àû´çÈ÷ Á¶ÀýÇÑ´Ù.
187                        {
188                                fwrite(packet, 1, 188, fp); // ÆÄÀÏ ÀúÀå
189                        }
190                       
191                        nBlockNumber++;
192                }
193        }
194        fclose(fp);
195        return 0;
196}
Note: See TracBrowser for help on using the repository browser.