1 /*
2  * Copyright (c) 2013 - Mauro Carvalho Chehab <mchehab@kernel.org>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation version 2.1 of the License.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16  * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
17  *
18  * Described on ARIB STD-B10 as Partial reception descriptor
19  */
20 
21 #include <libdvbv5/desc_partial_reception.h>
22 #include <libdvbv5/dvb-fe.h>
23 
24 #if __GNUC__ >= 9
25 #pragma GCC diagnostic ignored "-Waddress-of-packed-member"
26 #endif
27 
isdb_desc_partial_reception_init(struct dvb_v5_fe_parms * parms,const uint8_t * buf,struct dvb_desc * desc)28 int isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms,
29 			      const uint8_t *buf, struct dvb_desc *desc)
30 {
31 	struct isdb_desc_partial_reception *d = (void *)desc;
32 	unsigned char *p = (unsigned char *)buf;
33 	size_t len;
34 	int i;
35 
36 	d->partial_reception = malloc(d->length);
37 	if (!d->partial_reception) {
38 		dvb_logerr("%s: out of memory", __func__);
39 		return -1;
40 	}
41 
42 	memcpy(d->partial_reception, p, d->length);
43 
44        len = d->length / sizeof(*d->partial_reception);
45 
46 	for (i = 0; i < len; i++)
47 		bswap16(d->partial_reception[i].service_id);
48 	return 0;
49 }
50 
isdb_desc_partial_reception_free(struct dvb_desc * desc)51 void isdb_desc_partial_reception_free(struct dvb_desc *desc)
52 {
53 	struct isdb_desc_partial_reception *d = (void *)desc;
54 	if (d->partial_reception)
55 		free(d->partial_reception);
56 }
57 
isdb_desc_partial_reception_print(struct dvb_v5_fe_parms * parms,const struct dvb_desc * desc)58 void isdb_desc_partial_reception_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
59 {
60 	struct isdb_desc_partial_reception *d = (void *)desc;
61 	int i;
62 	size_t len;
63 
64        len = d->length / sizeof(*d->partial_reception);
65 
66 	for (i = 0; i < len; i++) {
67 		dvb_loginfo("|           service ID[%d]     %d", i, d->partial_reception[i].service_id);
68 	}
69 }
70