Skip to content

Commit 5edbd33

Browse files
committed
media: vidtv: simplify PSI write function
The function vidtv_psi_ts_psi_write_into() initializes the ts_header fields several times, and receives a struct as argument, instead of using a pointer to struct. Cleanup the function, in order to reduce its stack usage and to avoid initializing the ts_header multiple times. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
1 parent 1600285 commit 5edbd33

1 file changed

Lines changed: 63 additions & 67 deletions

File tree

drivers/media/test-drivers/vidtv/vidtv_psi.c

Lines changed: 63 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -162,79 +162,75 @@ static void vidtv_psi_set_sec_len(struct vidtv_psi_table_header *h, u16 new_len)
162162
* manage the continuity_counter
163163
* add stuffing (i.e. padding bytes) after the CRC
164164
*/
165-
static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args args)
165+
static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args *args)
166166
{
167-
168-
u32 nbytes_past_boundary = (args.dest_offset % TS_PACKET_LEN);
167+
struct vidtv_mpeg_ts ts_header = {
168+
.sync_byte = TS_SYNC_BYTE,
169+
.bitfield = cpu_to_be16((args->new_psi_section << 14) | args->pid),
170+
.scrambling = 0,
171+
.payload = 1,
172+
.adaptation_field = 0, /* no adaptation field */
173+
};
174+
u32 nbytes_past_boundary = (args->dest_offset % TS_PACKET_LEN);
169175
bool aligned = (nbytes_past_boundary == 0);
170-
struct vidtv_mpeg_ts ts_header = {};
171-
u32 remaining_len = args.len;
176+
u32 remaining_len = args->len;
172177
u32 payload_write_len = 0;
173178
u32 payload_offset = 0;
174179
u32 nbytes = 0;
175180

176-
const u16 PAYLOAD_START = args.new_psi_section;
177-
178-
if (!args.crc && !args.is_crc)
181+
if (!args->crc && !args->is_crc)
179182
pr_warn_ratelimited("Missing CRC for chunk\n");
180183

181-
if (args.crc)
182-
*args.crc = dvb_crc32(*args.crc, args.from, args.len);
184+
if (args->crc)
185+
*args->crc = dvb_crc32(*args->crc, args->from, args->len);
183186

184-
if (args.new_psi_section && !aligned) {
187+
if (args->new_psi_section && !aligned) {
185188
pr_warn_ratelimited("Cannot write a new PSI section in a misaligned buffer\n");
186189

187190
/* forcibly align and hope for the best */
188-
nbytes += vidtv_memset(args.dest_buf,
189-
args.dest_offset + nbytes,
190-
args.dest_buf_sz,
191+
nbytes += vidtv_memset(args->dest_buf,
192+
args->dest_offset + nbytes,
193+
args->dest_buf_sz,
191194
TS_FILL_BYTE,
192195
TS_PACKET_LEN - nbytes_past_boundary);
193196
}
194197

195198
while (remaining_len) {
196-
nbytes_past_boundary = (args.dest_offset + nbytes) % TS_PACKET_LEN;
199+
nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN;
197200
aligned = (nbytes_past_boundary == 0);
198201

199202
if (aligned) {
200203
/* if at a packet boundary, write a new TS header */
201-
ts_header.sync_byte = TS_SYNC_BYTE;
202-
ts_header.bitfield = cpu_to_be16((PAYLOAD_START << 14) | args.pid);
203-
ts_header.scrambling = 0;
204-
ts_header.continuity_counter = *args.continuity_counter;
205-
ts_header.payload = 1;
206-
/* no adaptation field */
207-
ts_header.adaptation_field = 0;
208-
209-
/* copy the header */
210-
nbytes += vidtv_memcpy(args.dest_buf,
211-
args.dest_offset + nbytes,
212-
args.dest_buf_sz,
204+
ts_header.continuity_counter = *args->continuity_counter;
205+
206+
nbytes += vidtv_memcpy(args->dest_buf,
207+
args->dest_offset + nbytes,
208+
args->dest_buf_sz,
213209
&ts_header,
214210
sizeof(ts_header));
215211
/*
216212
* This will trigger a discontinuity if the buffer is full,
217213
* effectively dropping the packet.
218214
*/
219-
vidtv_ts_inc_cc(args.continuity_counter);
215+
vidtv_ts_inc_cc(args->continuity_counter);
220216
}
221217

222218
/* write the pointer_field in the first byte of the payload */
223-
if (args.new_psi_section)
224-
nbytes += vidtv_memset(args.dest_buf,
225-
args.dest_offset + nbytes,
226-
args.dest_buf_sz,
219+
if (args->new_psi_section)
220+
nbytes += vidtv_memset(args->dest_buf,
221+
args->dest_offset + nbytes,
222+
args->dest_buf_sz,
227223
0x0,
228224
1);
229225

230226
/* write as much of the payload as possible */
231-
nbytes_past_boundary = (args.dest_offset + nbytes) % TS_PACKET_LEN;
227+
nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN;
232228
payload_write_len = min(TS_PACKET_LEN - nbytes_past_boundary, remaining_len);
233229

234-
nbytes += vidtv_memcpy(args.dest_buf,
235-
args.dest_offset + nbytes,
236-
args.dest_buf_sz,
237-
args.from + payload_offset,
230+
nbytes += vidtv_memcpy(args->dest_buf,
231+
args->dest_offset + nbytes,
232+
args->dest_buf_sz,
233+
args->from + payload_offset,
238234
payload_write_len);
239235

240236
/* 'payload_write_len' written from a total of 'len' requested*/
@@ -246,12 +242,12 @@ static u32 vidtv_psi_ts_psi_write_into(struct psi_write_args args)
246242
* fill the rest of the packet if there is any remaining space unused
247243
*/
248244

249-
nbytes_past_boundary = (args.dest_offset + nbytes) % TS_PACKET_LEN;
245+
nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN;
250246

251-
if (args.is_crc)
252-
nbytes += vidtv_memset(args.dest_buf,
253-
args.dest_offset + nbytes,
254-
args.dest_buf_sz,
247+
if (args->is_crc)
248+
nbytes += vidtv_memset(args->dest_buf,
249+
args->dest_offset + nbytes,
250+
args->dest_buf_sz,
255251
TS_FILL_BYTE,
256252
TS_PACKET_LEN - nbytes_past_boundary);
257253

@@ -275,7 +271,7 @@ static u32 table_section_crc32_write_into(struct crc32_write_args args)
275271
psi_args.is_crc = true;
276272
psi_args.dest_buf_sz = args.dest_buf_sz;
277273

278-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
274+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
279275

280276
return nbytes;
281277
}
@@ -662,7 +658,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
662658
psi_args.dest_buf_sz = args.dest_buf_sz;
663659
psi_args.crc = args.crc;
664660

665-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
661+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
666662

667663
switch (args.desc->type) {
668664
case SERVICE_DESCRIPTOR:
@@ -671,33 +667,33 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
671667
sizeof_field(struct vidtv_psi_desc_service, provider_name_len);
672668
psi_args.from = &((struct vidtv_psi_desc_service *)args.desc)->service_type;
673669

674-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
670+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
675671

676672
psi_args.dest_offset = args.dest_offset + nbytes;
677673
psi_args.len = ((struct vidtv_psi_desc_service *)args.desc)->provider_name_len;
678674
psi_args.from = ((struct vidtv_psi_desc_service *)args.desc)->provider_name;
679675

680-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
676+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
681677

682678
psi_args.dest_offset = args.dest_offset + nbytes;
683679
psi_args.len = sizeof_field(struct vidtv_psi_desc_service, service_name_len);
684680
psi_args.from = &((struct vidtv_psi_desc_service *)args.desc)->service_name_len;
685681

686-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
682+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
687683

688684
psi_args.dest_offset = args.dest_offset + nbytes;
689685
psi_args.len = ((struct vidtv_psi_desc_service *)args.desc)->service_name_len;
690686
psi_args.from = ((struct vidtv_psi_desc_service *)args.desc)->service_name;
691687

692-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
688+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
693689
break;
694690

695691
case NETWORK_NAME_DESCRIPTOR:
696692
psi_args.dest_offset = args.dest_offset + nbytes;
697693
psi_args.len = args.desc->length;
698694
psi_args.from = ((struct vidtv_psi_desc_network_name *)args.desc)->network_name;
699695

700-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
696+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
701697
break;
702698

703699
case SERVICE_LIST_DESCRIPTOR:
@@ -708,7 +704,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
708704
sizeof(struct vidtv_psi_desc_service_list_entry *);
709705
psi_args.from = serv_list_entry;
710706

711-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
707+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
712708

713709
serv_list_entry = serv_list_entry->next;
714710
}
@@ -720,32 +716,32 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
720716
psi_args.from = ((struct vidtv_psi_desc_short_event *)
721717
args.desc)->iso_language_code;
722718

723-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
719+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
724720

725721
psi_args.dest_offset = args.dest_offset + nbytes;
726722
psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, event_name_len);
727723
psi_args.from = &((struct vidtv_psi_desc_short_event *)
728724
args.desc)->event_name_len;
729725

730-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
726+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
731727

732728
psi_args.dest_offset = args.dest_offset + nbytes;
733729
psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name_len;
734730
psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->event_name;
735731

736-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
732+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
737733

738734
psi_args.dest_offset = args.dest_offset + nbytes;
739735
psi_args.len = sizeof_field(struct vidtv_psi_desc_short_event, text_len);
740736
psi_args.from = &((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
741737

742-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
738+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
743739

744740
psi_args.dest_offset = args.dest_offset + nbytes;
745741
psi_args.len = ((struct vidtv_psi_desc_short_event *)args.desc)->text_len;
746742
psi_args.from = ((struct vidtv_psi_desc_short_event *)args.desc)->text;
747743

748-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
744+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
749745

750746
break;
751747

@@ -755,7 +751,7 @@ static u32 vidtv_psi_desc_write_into(struct desc_write_args args)
755751
psi_args.len = args.desc->length;
756752
psi_args.from = &args.desc->data;
757753

758-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
754+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
759755
break;
760756
}
761757

@@ -780,7 +776,7 @@ vidtv_psi_table_header_write_into(struct header_write_args args)
780776
psi_args.dest_buf_sz = args.dest_buf_sz;
781777
psi_args.crc = args.crc;
782778

783-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
779+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
784780

785781
return nbytes;
786782
}
@@ -1014,7 +1010,7 @@ u32 vidtv_psi_pat_write_into(struct vidtv_psi_pat_write_args args)
10141010
sizeof(struct vidtv_psi_table_pat_program *);
10151011
psi_args.dest_offset = args.offset + nbytes;
10161012

1017-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1013+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
10181014

10191015
p = p->next;
10201016
}
@@ -1207,7 +1203,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
12071203
psi_args.dest_buf_sz = args.buf_sz;
12081204
psi_args.crc = &crc;
12091205

1210-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1206+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
12111207

12121208
while (table_descriptor) {
12131209
/* write the descriptors, if any */
@@ -1232,7 +1228,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args args)
12321228
sizeof_field(struct vidtv_psi_table_pmt_stream, bitfield2);
12331229
psi_args.dest_offset = args.offset + nbytes;
12341230

1235-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1231+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
12361232

12371233
stream_descriptor = stream->descriptor;
12381234

@@ -1360,7 +1356,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
13601356
psi_args.crc = &crc;
13611357

13621358
/* copy u16 network_id + u8 reserved)*/
1363-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1359+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
13641360

13651361
while (service) {
13661362
/* copy the services, if any */
@@ -1371,7 +1367,7 @@ u32 vidtv_psi_sdt_write_into(struct vidtv_psi_sdt_write_args args)
13711367
sizeof(struct vidtv_psi_table_sdt_service *);
13721368
psi_args.dest_offset = args.offset + nbytes;
13731369

1374-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1370+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
13751371

13761372
service_desc = service->descriptor;
13771373

@@ -1694,7 +1690,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
16941690
psi_args.dest_buf_sz = args.buf_sz;
16951691
psi_args.crc = &crc;
16961692

1697-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1693+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
16981694

16991695
while (table_descriptor) {
17001696
/* write the descriptors, if any */
@@ -1718,7 +1714,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
17181714
psi_args.dest_offset = args.offset + nbytes;
17191715
psi_args.pid = VIDTV_NIT_PID;
17201716

1721-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1717+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
17221718

17231719
while (transport) {
17241720
/* write the transport sections, if any */
@@ -1728,7 +1724,7 @@ u32 vidtv_psi_nit_write_into(struct vidtv_psi_nit_write_args args)
17281724
sizeof_field(struct vidtv_psi_table_transport, bitfield);
17291725
psi_args.dest_offset = args.offset + nbytes;
17301726

1731-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1727+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
17321728

17331729
transport_descriptor = transport->descriptor;
17341730

@@ -1907,7 +1903,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
19071903
psi_args.dest_buf_sz = args.buf_sz;
19081904
psi_args.crc = &crc;
19091905

1910-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1906+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
19111907

19121908
while (event) {
19131909
/* copy the events, if any */
@@ -1918,7 +1914,7 @@ u32 vidtv_psi_eit_write_into(struct vidtv_psi_eit_write_args args)
19181914
sizeof(struct vidtv_psi_table_eit_event *);
19191915
psi_args.dest_offset = args.offset + nbytes;
19201916

1921-
nbytes += vidtv_psi_ts_psi_write_into(psi_args);
1917+
nbytes += vidtv_psi_ts_psi_write_into(&psi_args);
19221918

19231919
event_descriptor = event->descriptor;
19241920

0 commit comments

Comments
 (0)