forked from dogeel/recbond
-
Notifications
You must be signed in to change notification settings - Fork 0
/
decoder.c
141 lines (114 loc) · 2.47 KB
/
decoder.c
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdlib.h>
#include <stdio.h>
#include "decoder.h"
#ifdef HAVE_LIBARIB25
DECODER *
b25_startup(decoder_options *opt)
{
DECODER *dec = (DECODER *)calloc(1, sizeof(DECODER));
int code;
const char *err = NULL;
dec->b25 = create_arib_std_b25();
if(!dec->b25) {
err = "create_arib_std_b25 failed";
goto error;
}
code = dec->b25->set_multi2_round(dec->b25, opt->round);
if(code < 0) {
err = "set_multi2_round failed";
goto error;
}
code = dec->b25->set_strip(dec->b25, opt->strip);
if(code < 0) {
err = "set_strip failed";
goto error;
}
code = dec->b25->set_emm_proc(dec->b25, opt->emm);
if(code < 0) {
err = "set_emm_proc failed";
goto error;
}
dec->bcas = create_b_cas_card();
if(!dec->bcas) {
err = "create_b_cas_card failed";
goto error;
}
code = dec->bcas->init(dec->bcas);
if(code < 0) {
err = "bcas->init failed";
goto error;
}
code = dec->b25->set_b_cas_card(dec->b25, dec->bcas);
if(code < 0) {
err = "set_b_cas_card failed";
goto error;
}
return dec;
error:
fprintf(stderr, "%s\n", err);
free(dec);
return NULL;
}
int
b25_shutdown(DECODER *dec)
{
dec->b25->release(dec->b25);
dec->bcas->release(dec->bcas);
free(dec);
return 0;
}
int
b25_decode(DECODER *dec, ARIB_STD_B25_BUFFER *sbuf, ARIB_STD_B25_BUFFER *dbuf)
{
int code;
code = dec->b25->put(dec->b25, sbuf);
if(code < 0) {
fprintf(stderr, "b25->put failed\n");
return code;
}
code = dec->b25->get(dec->b25, dbuf);
if(code != 0) {
fprintf(stderr, "b25->get failed\n");
return code;
}
return 0;
}
int
b25_finish(DECODER *dec, ARIB_STD_B25_BUFFER *sbuf, ARIB_STD_B25_BUFFER *dbuf)
{
int code;
code = dec->b25->flush(dec->b25);
if(code < 0) {
fprintf(stderr, "b25->flush failed\n");
return code;
}
code = dec->b25->get(dec->b25, dbuf);
if(code < 0) {
fprintf(stderr, "b25->get failed\n");
return code;
}
return code;
}
#else
/* functions */
DECODER *b25_startup(decoder_options *opt)
{
return NULL;
}
int b25_shutdown(DECODER *dec)
{
return 0;
}
int b25_decode(DECODER *dec,
ARIB_STD_B25_BUFFER *sbuf,
ARIB_STD_B25_BUFFER *dbuf)
{
return 0;
}
int b25_finish(DECODER *dec,
ARIB_STD_B25_BUFFER *sbuf,
ARIB_STD_B25_BUFFER *dbuf)
{
return 0;
}
#endif