source: svn/trunk/newcon3bcm2_21bu/BSEAV/lib/bcmplayer/utils/btp_generator.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 5.5 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <stdbool.h>
5
6int g_timestampOffset = 0;
7unsigned g_packetSize = 188;
8unsigned short g_pid = 0;
9unsigned char g_pkt[192];
10unsigned long g_params[10];
11
12#if defined BCHP_7411_VER
13#define TT_MODE_PLAY                            0x09
14#else
15#define TT_MODE_PLAY                            0x00
16#endif
17#define TT_MODE_DISPLAY                         0x01
18#define TT_MODE_BUILD_REFERENCE         0x02
19#define TT_MODE_PROCESS                         0x03
20#define TT_MODE_DISCARD_TILL_BTP        0x04
21#define TT_MODE_DISPLAY_FORWARD         0x05
22#define TT_MODE_DISPLAY_REWIND          0x06
23#define TT_MODE_DISPLAY_PAST_BUFFER     0x07
24
25void BuildBTPParams(unsigned long *params, int mode, int skip, int display, int discard_headend, int discard_tailend, unsigned long pts)
26{
27        params[0] = mode;
28        params[1] = skip;               /* SKIP_COUNT */
29        params[2] = display;            /* DISPLAY_COUNT */
30        params[7] = discard_headend;
31        params[8] = discard_tailend;
32        params[9] = pts;
33}
34
35void GenerateBTP(const unsigned long *params, unsigned char *pkt, bool discarding_tailend)
36{
37        unsigned i;
38
39        pkt[g_timestampOffset+0] = 0x47;   /* SYNC BYTE */
40        pkt[g_timestampOffset+1] = (g_pid >> 8) & 0x1f;
41        pkt[g_timestampOffset+2] = g_pid & 0xff;  /* PID */
42        pkt[g_timestampOffset+3] = 0x20; /* not scrambled, adaptation_field and no payload, 0 continuity counter */
43        pkt[g_timestampOffset+4] = 0xb7; /* adaptation field length is 183 - the remainder of the packet */
44        if (discarding_tailend)
45                pkt[g_timestampOffset+5] = 0x02; /* don't set discontinuity_indicator in this condition */
46        else
47                pkt[g_timestampOffset+5] = 0x82;
48        pkt[g_timestampOffset+6] = 45; /* Number of relevant bytes */
49        pkt[g_timestampOffset+7] = 0x00;  /* Align byte */
50        pkt[g_timestampOffset+8] = 0x42;        /* B */
51        pkt[g_timestampOffset+9] = 0x52;        /* R */
52        pkt[g_timestampOffset+10] = 0x43;       /* C */
53        pkt[g_timestampOffset+11] = 0x4d;       /* M */
54        for(i=0; i<10; ++i)
55        {
56                int base = g_timestampOffset + 12 + i*4;
57                pkt[base] = (unsigned char) ((params[i] & 0xff000000) >> 24);
58                pkt[base+1] = (unsigned char) ((params[i] & 0x00ff0000) >> 16);
59                pkt[base+2] = (unsigned char) ((params[i] & 0x0000ff00) >> 8);
60                pkt[base+3] = (unsigned char) (params[i] & 0x000000ff);
61        }
62        for(i=g_timestampOffset+52; i<g_packetSize; ++i)
63        {
64                pkt[i] = 0x00;
65        }
66}
67
68int ccounter = 0;
69void GenerateData(unsigned char *pkt, int startnumber)
70{
71        unsigned i;
72
73        pkt[g_timestampOffset+0] = 0x47;   /* SYNC BYTE */
74        pkt[g_timestampOffset+1] = (g_pid >> 8) & 0x1f;
75        pkt[g_timestampOffset+2] = g_pid & 0xff;  /* PID */
76        pkt[g_timestampOffset+3] = 0x10 | ccounter; /* not scrambled, no adaptation_field, ccounter */
77        if (++ccounter > 0xF)
78                ccounter = 0;
79        for(i=0; i<g_packetSize-4; ++i)
80        {
81                if (i == 0)
82                        pkt[i+4+g_timestampOffset] = startnumber;
83                else
84                        pkt[i+4+g_timestampOffset] = i;
85        }
86}
87
88void printUsage() 
89{
90        printf(
91        "Usage: btp_generator PID CMD >btpfile.dat\n"
92        " CMD is a number. See code for details.\n"
93        " output to stdout.\n"
94        );
95}
96
97int main(int argc, char **argv)
98{
99        int i;
100       
101        if (argc < 3) {
102                printUsage();
103                return -1;
104        }
105       
106        g_pid = strtoul(argv[1], NULL, 0);
107        memset(g_params, 0, sizeof(g_params));
108       
109        switch (atoi(argv[2])) {
110        case 0:
111                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 20, 100, 0x01234578);
112                GenerateBTP(g_params, g_pkt, false);
113                fwrite(g_pkt, 188, 1, stdout);
114               
115                GenerateData(g_pkt, 0);
116                fwrite(g_pkt, 188, 1, stdout);
117                break;
118        case 1:
119                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 20, 188, 0x01234578);
120                GenerateBTP(g_params, g_pkt, false);
121                fwrite(g_pkt, 188, 1, stdout);
122               
123                GenerateData(g_pkt, 0);
124                fwrite(g_pkt, 188, 1, stdout);
125               
126                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 0, 20, 0x01234578);
127                GenerateBTP(g_params, g_pkt, false);
128                fwrite(g_pkt, 188, 1, stdout);
129               
130                GenerateData(g_pkt, 0);
131                fwrite(g_pkt, 188, 1, stdout);
132                break;
133        case 2:
134                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 20, 188, 0x01234578);
135                GenerateBTP(g_params, g_pkt, false);
136                fwrite(g_pkt, 188, 1, stdout);
137               
138                for (i=0;i<10;i++) {
139                        GenerateData(g_pkt, 0);
140                        fwrite(g_pkt, 188, 1, stdout);
141                }
142               
143                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 0, 20, 0x01234578);
144                GenerateBTP(g_params, g_pkt, false);
145                fwrite(g_pkt, 188, 1, stdout);
146               
147                GenerateData(g_pkt, 0x10);
148                fwrite(g_pkt, 188, 1, stdout);
149                break;
150        case 3:
151                if (argc < 2 + 4) break;
152               
153                {
154                int discard_headend = atoi(argv[3]);
155                int num_packets_except_last = atoi(argv[4]);
156                int discard_tailend = atoi(argv[5]);
157               
158                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, discard_headend, 188, 0x01234578);
159                GenerateBTP(g_params, g_pkt, false);
160                fwrite(g_pkt, 188, 1, stdout);
161               
162                for (i=0;i<num_packets_except_last;i++) {
163                        GenerateData(g_pkt, i);
164                        fwrite(g_pkt, 188, 1, stdout);
165                }
166               
167                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 0, discard_tailend, 0x01234578);
168                GenerateBTP(g_params, g_pkt, false);
169                fwrite(g_pkt, 188, 1, stdout);
170               
171                GenerateData(g_pkt, i);
172                fwrite(g_pkt, 188, 1, stdout);
173                }
174                break;
175        case 4:
176                for (i=0;i<atoi(argv[3]);i++) {
177                        GenerateData(g_pkt, i);
178                        fwrite(g_pkt, 188, 1, stdout);
179                }
180                break;
181        case 5:
182                {
183                int discard_headend = atoi(argv[3]);
184                int num_packets_except_last = atoi(argv[4]);
185                int discard_tailend = atoi(argv[5]);
186               
187                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, 0, discard_tailend, 0x01234578);
188                GenerateBTP(g_params, g_pkt, false);
189                fwrite(g_pkt, 188, 1, stdout);
190               
191                for (i=0;i<num_packets_except_last;i++) {
192                        GenerateData(g_pkt, i);
193                        fwrite(g_pkt, 188, 1, stdout);
194                }
195               
196                BuildBTPParams(g_params, TT_MODE_PROCESS, 0, 0, discard_headend, 188, 0x01234578);
197                GenerateBTP(g_params, g_pkt, false);
198                fwrite(g_pkt, 188, 1, stdout);
199               
200                GenerateData(g_pkt, i);
201                fwrite(g_pkt, 188, 1, stdout);
202                }
203                break;
204        }
205        return 0;
206}
Note: See TracBrowser for help on using the repository browser.