Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: dvb: update buffer mmaped flags and frame counter

Now that we have support for a buffer counter and for
error flags, update them at DMX_DQBUF.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

+160 -76
+15 -9
drivers/media/dvb-core/dmxdev.c
··· 385 385 386 386 static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len, 387 387 const u8 *buffer2, size_t buffer2_len, 388 - struct dmx_section_filter *filter) 388 + struct dmx_section_filter *filter, 389 + u32 *buffer_flags) 389 390 { 390 391 struct dmxdev_filter *dmxdevfilter = filter->priv; 391 392 int ret; ··· 405 404 dprintk("section callback %*ph\n", 6, buffer1); 406 405 if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) { 407 406 ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, 408 - buffer1, buffer1_len); 407 + buffer1, buffer1_len, 408 + buffer_flags); 409 409 if (ret == buffer1_len) 410 410 ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx, 411 - buffer2, buffer2_len); 411 + buffer2, buffer2_len, 412 + buffer_flags); 412 413 } else { 413 414 ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, 414 415 buffer1, buffer1_len); ··· 430 427 431 428 static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len, 432 429 const u8 *buffer2, size_t buffer2_len, 433 - struct dmx_ts_feed *feed) 430 + struct dmx_ts_feed *feed, 431 + u32 *buffer_flags) 434 432 { 435 433 struct dmxdev_filter *dmxdevfilter = feed->priv; 436 434 struct dvb_ringbuffer *buffer; ··· 460 456 } 461 457 462 458 if (dvb_vb2_is_streaming(ctx)) { 463 - ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len); 459 + ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len, 460 + buffer_flags); 464 461 if (ret == buffer1_len) 465 - ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len); 462 + ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len, 463 + buffer_flags); 466 464 } else { 467 465 if (buffer->error) { 468 466 spin_unlock(&dmxdevfilter->dev->lock); ··· 1224 1218 int ret; 1225 1219 1226 1220 if (!dmxdev->may_do_mmap) 1227 - return -EOPNOTSUPP; 1221 + return -ENOTTY; 1228 1222 1229 1223 if (mutex_lock_interruptible(&dmxdev->mutex)) 1230 1224 return -ERESTARTSYS; ··· 1324 1318 break; 1325 1319 #endif 1326 1320 default: 1327 - ret = -EINVAL; 1321 + ret = -ENOTTY; 1328 1322 break; 1329 1323 } 1330 1324 mutex_unlock(&dmxdev->mutex); ··· 1373 1367 int ret; 1374 1368 1375 1369 if (!dmxdev->may_do_mmap) 1376 - return -EOPNOTSUPP; 1370 + return -ENOTTY; 1377 1371 1378 1372 if (dmxdev->exit) 1379 1373 return -ENODEV;
+73 -39
drivers/media/dvb-core/dvb_demux.c
··· 55 55 dprintk(x); \ 56 56 } while (0) 57 57 58 + #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 59 + # define dprintk_sect_loss(x...) dprintk(x) 60 + #else 61 + # define dprintk_sect_loss(x...) 62 + #endif 63 + 64 + #define set_buf_flags(__feed, __flag) \ 65 + do { \ 66 + (__feed)->buffer_flags |= (__flag); \ 67 + } while (0) 68 + 58 69 /****************************************************************************** 59 70 * static inlined helper functions 60 71 ******************************************************************************/ ··· 115 104 { 116 105 int count = payload(buf); 117 106 int p; 118 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 119 107 int ccok; 120 108 u8 cc; 121 - #endif 122 109 123 110 if (count == 0) 124 111 return -1; 125 112 126 113 p = 188 - count; 127 114 128 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 129 115 cc = buf[3] & 0x0f; 130 116 ccok = ((feed->cc + 1) & 0x0f) == cc; 131 117 feed->cc = cc; 132 - if (!ccok) 133 - dprintk("missed packet: %d instead of %d!\n", 134 - cc, (feed->cc + 1) & 0x0f); 135 - #endif 118 + if (!ccok) { 119 + set_buf_flags(feed, DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); 120 + dprintk_sect_loss("missed packet: %d instead of %d!\n", 121 + cc, (feed->cc + 1) & 0x0f); 122 + } 136 123 137 124 if (buf[1] & 0x40) // PUSI ? 138 125 feed->peslen = 0xfffa; 139 126 140 127 feed->peslen += count; 141 128 142 - return feed->cb.ts(&buf[p], count, NULL, 0, &feed->feed.ts); 129 + return feed->cb.ts(&buf[p], count, NULL, 0, &feed->feed.ts, 130 + &feed->buffer_flags); 143 131 } 144 132 145 133 static int dvb_dmx_swfilter_sectionfilter(struct dvb_demux_feed *feed, ··· 160 150 return 0; 161 151 162 152 return feed->cb.sec(feed->feed.sec.secbuf, feed->feed.sec.seclen, 163 - NULL, 0, &f->filter); 153 + NULL, 0, &f->filter, &feed->buffer_flags); 164 154 } 165 155 166 156 static inline int dvb_dmx_swfilter_section_feed(struct dvb_demux_feed *feed) ··· 179 169 if (sec->check_crc) { 180 170 section_syntax_indicator = ((sec->secbuf[1] & 0x80) != 0); 181 171 if (section_syntax_indicator && 182 - demux->check_crc32(feed, sec->secbuf, sec->seclen)) 172 + demux->check_crc32(feed, sec->secbuf, sec->seclen)) { 173 + set_buf_flags(feed, DMX_BUFFER_FLAG_HAD_CRC32_DISCARD); 183 174 return -1; 175 + } 184 176 } 185 177 186 178 do { ··· 199 187 { 200 188 struct dmx_section_feed *sec = &feed->feed.sec; 201 189 202 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 203 190 if (sec->secbufp < sec->tsfeedp) { 204 191 int n = sec->tsfeedp - sec->secbufp; 205 192 ··· 208 197 * but just first and last. 209 198 */ 210 199 if (sec->secbuf[0] != 0xff || sec->secbuf[n - 1] != 0xff) { 211 - dprintk("section ts padding loss: %d/%d\n", 212 - n, sec->tsfeedp); 213 - dprintk("pad data: %*ph\n", n, sec->secbuf); 200 + set_buf_flags(feed, 201 + DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); 202 + dprintk_sect_loss("section ts padding loss: %d/%d\n", 203 + n, sec->tsfeedp); 204 + dprintk_sect_loss("pad data: %*ph\n", n, sec->secbuf); 214 205 } 215 206 } 216 - #endif 217 207 218 208 sec->tsfeedp = sec->secbufp = sec->seclen = 0; 219 209 sec->secbuf = sec->secbuf_base; ··· 249 237 return 0; 250 238 251 239 if (sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE) { 252 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 253 - dprintk("section buffer full loss: %d/%d\n", 254 - sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, 255 - DMX_MAX_SECFEED_SIZE); 256 - #endif 240 + set_buf_flags(feed, DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); 241 + dprintk_sect_loss("section buffer full loss: %d/%d\n", 242 + sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, 243 + DMX_MAX_SECFEED_SIZE); 257 244 len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp; 258 245 } 259 246 ··· 280 269 sec->seclen = seclen; 281 270 sec->crc_val = ~0; 282 271 /* dump [secbuf .. secbuf+seclen) */ 283 - if (feed->pusi_seen) 272 + if (feed->pusi_seen) { 284 273 dvb_dmx_swfilter_section_feed(feed); 285 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 286 - else 287 - dprintk("pusi not seen, discarding section data\n"); 288 - #endif 274 + } else { 275 + set_buf_flags(feed, 276 + DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); 277 + dprintk_sect_loss("pusi not seen, discarding section data\n"); 278 + } 289 279 sec->secbufp += seclen; /* secbufp and secbuf moving together is */ 290 280 sec->secbuf += seclen; /* redundant but saves pointer arithmetic */ 291 281 } ··· 319 307 } 320 308 321 309 if (!ccok || dc_i) { 322 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 323 - if (dc_i) 324 - dprintk("%d frame with disconnect indicator\n", 310 + if (dc_i) { 311 + set_buf_flags(feed, 312 + DMX_BUFFER_FLAG_DISCONTINUITY_INDICATOR); 313 + dprintk_sect_loss("%d frame with disconnect indicator\n", 325 314 cc); 326 - else 327 - dprintk("discontinuity: %d instead of %d. %d bytes lost\n", 315 + } else { 316 + set_buf_flags(feed, 317 + DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); 318 + dprintk_sect_loss("discontinuity: %d instead of %d. %d bytes lost\n", 328 319 cc, (feed->cc + 1) & 0x0f, count + 4); 320 + } 329 321 /* 330 - * those bytes under sume circumstances will again be reported 322 + * those bytes under some circumstances will again be reported 331 323 * in the following dvb_dmx_swfilter_section_new 332 324 */ 333 - #endif 325 + 334 326 /* 335 327 * Discontinuity detected. Reset pusi_seen to 336 328 * stop feeding of suspicious data until next PUSI=1 arrives ··· 342 326 * FIXME: does it make sense if the MPEG-TS is the one 343 327 * reporting discontinuity? 344 328 */ 329 + 345 330 feed->pusi_seen = false; 346 331 dvb_dmx_swfilter_section_new(feed); 347 332 } ··· 362 345 dvb_dmx_swfilter_section_new(feed); 363 346 dvb_dmx_swfilter_section_copy_dump(feed, after, 364 347 after_len); 348 + } else if (count > 0) { 349 + set_buf_flags(feed, 350 + DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED); 351 + dprintk_sect_loss("PUSI=1 but %d bytes lost\n", count); 365 352 } 366 - #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG 367 - else if (count > 0) 368 - dprintk("PUSI=1 but %d bytes lost\n", count); 369 - #endif 370 353 } else { 371 354 /* PUSI=0 (is not set), no section boundary */ 372 355 dvb_dmx_swfilter_section_copy_dump(feed, &buf[p], count); ··· 386 369 if (feed->ts_type & TS_PAYLOAD_ONLY) 387 370 dvb_dmx_swfilter_payload(feed, buf); 388 371 else 389 - feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts); 372 + feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts, 373 + &feed->buffer_flags); 390 374 } 391 375 /* Used only on full-featured devices */ 392 376 if (feed->ts_type & TS_DECODER) ··· 448 430 } 449 431 450 432 if (buf[1] & 0x80) { 433 + list_for_each_entry(feed, &demux->feed_list, list_head) { 434 + if ((feed->pid != pid) && (feed->pid != 0x2000)) 435 + continue; 436 + set_buf_flags(feed, DMX_BUFFER_FLAG_TEI); 437 + } 451 438 dprintk_tscheck("TEI detected. PID=0x%x data1=0x%x\n", 452 439 pid, buf[1]); 453 440 /* data in this packet can't be trusted - drop it unless ··· 468 445 (demux->cnt_storage[pid] + 1) & 0xf; 469 446 470 447 if ((buf[3] & 0xf) != demux->cnt_storage[pid]) { 448 + list_for_each_entry(feed, &demux->feed_list, list_head) { 449 + if ((feed->pid != pid) && (feed->pid != 0x2000)) 450 + continue; 451 + set_buf_flags(feed, 452 + DMX_BUFFER_PKT_COUNTER_MISMATCH); 453 + } 454 + 471 455 dprintk_tscheck("TS packet counter mismatch. PID=0x%x expected 0x%x got 0x%x\n", 472 456 pid, demux->cnt_storage[pid], 473 457 buf[3] & 0xf); ··· 496 466 if (feed->pid == pid) 497 467 dvb_dmx_swfilter_packet_type(feed, buf); 498 468 else if (feed->pid == 0x2000) 499 - feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts); 469 + feed->cb.ts(buf, 188, NULL, 0, &feed->feed.ts, 470 + &feed->buffer_flags); 500 471 } 501 472 } 502 473 ··· 616 585 617 586 spin_lock_irqsave(&demux->lock, flags); 618 587 619 - demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts); 588 + demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, 589 + &demux->feed->buffer_flags); 620 590 621 591 spin_unlock_irqrestore(&demux->lock, flags); 622 592 } ··· 817 785 feed->demux = demux; 818 786 feed->pid = 0xffff; 819 787 feed->peslen = 0xfffa; 788 + feed->buffer_flags = 0; 820 789 821 790 (*ts_feed) = &feed->feed.ts; 822 791 (*ts_feed)->parent = dmx; ··· 1075 1042 dvbdmxfeed->cb.sec = callback; 1076 1043 dvbdmxfeed->demux = dvbdmx; 1077 1044 dvbdmxfeed->pid = 0xffff; 1045 + dvbdmxfeed->buffer_flags = 0; 1078 1046 dvbdmxfeed->feed.sec.secbuf = dvbdmxfeed->feed.sec.secbuf_base; 1079 1047 dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0; 1080 1048 dvbdmxfeed->feed.sec.tsfeedp = 0;
+3 -2
drivers/media/dvb-core/dvb_net.c
··· 883 883 884 884 static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len, 885 885 const u8 *buffer2, size_t buffer2_len, 886 - struct dmx_ts_feed *feed) 886 + struct dmx_ts_feed *feed, 887 + u32 *buffer_flags) 887 888 { 888 889 struct net_device *dev = feed->priv; 889 890 ··· 993 992 994 993 static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len, 995 994 const u8 *buffer2, size_t buffer2_len, 996 - struct dmx_section_filter *filter) 995 + struct dmx_section_filter *filter, u32 *buffer_flags) 997 996 { 998 997 struct net_device *dev = filter->priv; 999 998
+22 -9
drivers/media/dvb-core/dvb_vb2.c
··· 256 256 } 257 257 258 258 int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, 259 - const unsigned char *src, int len) 259 + const unsigned char *src, int len, 260 + enum dmx_buffer_flags *buffer_flags) 260 261 { 261 262 unsigned long flags = 0; 262 263 void *vbuf = NULL; ··· 265 264 unsigned char *psrc = (unsigned char *)src; 266 265 int ll = 0; 267 266 268 - dprintk(3, "[%s] %d bytes are rcvd\n", ctx->name, len); 269 - if (!src) { 270 - dprintk(3, "[%s]:NULL pointer src\n", ctx->name); 271 - /**normal case: This func is called twice from demux driver 272 - * once with valid src pointer, second time with NULL pointer 273 - */ 267 + /* 268 + * normal case: This func is called twice from demux driver 269 + * one with valid src pointer, second time with NULL pointer 270 + */ 271 + if (!src || !len) 274 272 return 0; 275 - } 276 273 spin_lock_irqsave(&ctx->slock, flags); 274 + if (buffer_flags && *buffer_flags) { 275 + ctx->flags |= *buffer_flags; 276 + *buffer_flags = 0; 277 + } 277 278 while (todo) { 278 279 if (!ctx->buf) { 279 280 if (list_empty(&ctx->dvb_q)) { ··· 398 395 399 396 int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b) 400 397 { 398 + unsigned long flags; 401 399 int ret; 402 400 403 401 ret = vb2_core_dqbuf(&ctx->vb_q, &b->index, b, ctx->nonblocking); ··· 406 402 dprintk(1, "[%s] errno=%d\n", ctx->name, ret); 407 403 return ret; 408 404 } 409 - dprintk(5, "[%s] index=%d\n", ctx->name, b->index); 405 + 406 + spin_lock_irqsave(&ctx->slock, flags); 407 + b->count = ctx->count++; 408 + b->flags = ctx->flags; 409 + ctx->flags = 0; 410 + spin_unlock_irqrestore(&ctx->slock, flags); 411 + 412 + dprintk(5, "[%s] index=%d, count=%d, flags=%d\n", 413 + ctx->name, b->index, ctx->count, b->flags); 414 + 410 415 411 416 return 0; 412 417 }
+3 -2
drivers/media/pci/ttpci/av7110.c
··· 324 324 } 325 325 return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len, 326 326 buffer2, buffer2_len, 327 - &dvbdmxfilter->filter); 327 + &dvbdmxfilter->filter, NULL); 328 328 case DMX_TYPE_TS: 329 329 if (!(dvbdmxfilter->feed->ts_type & TS_PACKET)) 330 330 return 0; 331 331 if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY) 332 332 return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len, 333 333 buffer2, buffer2_len, 334 - &dvbdmxfilter->feed->feed.ts); 334 + &dvbdmxfilter->feed->feed.ts, 335 + NULL); 335 336 else 336 337 av7110_p2t_write(buffer1, buffer1_len, 337 338 dvbdmxfilter->feed->pid,
+3 -3
drivers/media/pci/ttpci/av7110_av.c
··· 99 99 buf[4] = buf[5] = 0; 100 100 if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) 101 101 return dvbdmxfeed->cb.ts(buf, len, NULL, 0, 102 - &dvbdmxfeed->feed.ts); 102 + &dvbdmxfeed->feed.ts, NULL); 103 103 else 104 104 return dvb_filter_pes2ts(p2t, buf, len, 1); 105 105 } ··· 109 109 struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *) priv; 110 110 111 111 dvbdmxfeed->cb.ts(data, 188, NULL, 0, 112 - &dvbdmxfeed->feed.ts); 112 + &dvbdmxfeed->feed.ts, NULL); 113 113 return 0; 114 114 } 115 115 ··· 814 814 memcpy(obuf + l, buf + c, TS_SIZE - l); 815 815 c = length; 816 816 } 817 - feed->cb.ts(obuf, 188, NULL, 0, &feed->feed.ts); 817 + feed->cb.ts(obuf, 188, NULL, 0, &feed->feed.ts, NULL); 818 818 pes_start = 0; 819 819 } 820 820 }
+5 -5
drivers/media/usb/ttusb-dec/ttusb_dec.c
··· 428 428 struct ttusb_dec *dec = priv; 429 429 430 430 dec->audio_filter->feed->cb.ts(data, 188, NULL, 0, 431 - &dec->audio_filter->feed->feed.ts); 431 + &dec->audio_filter->feed->feed.ts, NULL); 432 432 433 433 return 0; 434 434 } ··· 438 438 struct ttusb_dec *dec = priv; 439 439 440 440 dec->video_filter->feed->cb.ts(data, 188, NULL, 0, 441 - &dec->video_filter->feed->feed.ts); 441 + &dec->video_filter->feed->feed.ts, NULL); 442 442 443 443 return 0; 444 444 } ··· 490 490 491 491 if (output_pva) { 492 492 dec->video_filter->feed->cb.ts(pva, length, NULL, 0, 493 - &dec->video_filter->feed->feed.ts); 493 + &dec->video_filter->feed->feed.ts, NULL); 494 494 return; 495 495 } 496 496 ··· 551 551 case 0x02: /* MainAudioStream */ 552 552 if (output_pva) { 553 553 dec->audio_filter->feed->cb.ts(pva, length, NULL, 0, 554 - &dec->audio_filter->feed->feed.ts); 554 + &dec->audio_filter->feed->feed.ts, NULL); 555 555 return; 556 556 } 557 557 ··· 589 589 590 590 if (filter) 591 591 filter->feed->cb.sec(&packet[2], length - 2, NULL, 0, 592 - &filter->filter); 592 + &filter->filter, NULL); 593 593 } 594 594 595 595 static void ttusb_dec_process_packet(struct ttusb_dec *dec)
+16 -5
include/media/demux.h
··· 117 117 * specified by @filter_value that will be used on the filter 118 118 * match logic. 119 119 * @filter_mode: Contains a 16 bytes (128 bits) filter mode. 120 - * @parent: Pointer to struct dmx_section_feed. 120 + * @parent: Back-pointer to struct dmx_section_feed. 121 121 * @priv: Pointer to private data of the API client. 122 122 * 123 123 * ··· 130 130 u8 filter_value[DMX_MAX_FILTER_SIZE]; 131 131 u8 filter_mask[DMX_MAX_FILTER_SIZE]; 132 132 u8 filter_mode[DMX_MAX_FILTER_SIZE]; 133 - struct dmx_section_feed *parent; /* Back-pointer */ 134 - void *priv; /* Pointer to private data of the API client */ 133 + struct dmx_section_feed *parent; 134 + 135 + void *priv; 135 136 }; 136 137 137 138 /** ··· 194 193 * @buffer2: Pointer to the tail of the filtered TS packets, or NULL. 195 194 * @buffer2_length: Length of the TS data in buffer2. 196 195 * @source: Indicates which TS feed is the source of the callback. 196 + * @buffer_flags: Address where buffer flags are stored. Those are 197 + * used to report discontinuity users via DVB 198 + * memory mapped API, as defined by 199 + * &enum dmx_buffer_flags. 197 200 * 198 201 * This function callback prototype, provided by the client of the demux API, 199 202 * is called from the demux code. The function is only called when filtering ··· 250 245 size_t buffer1_length, 251 246 const u8 *buffer2, 252 247 size_t buffer2_length, 253 - struct dmx_ts_feed *source); 248 + struct dmx_ts_feed *source, 249 + u32 *buffer_flags); 254 250 255 251 /** 256 252 * typedef dmx_section_cb - DVB demux TS filter callback function prototype ··· 267 261 * including headers and CRC. 268 262 * @source: Indicates which section feed is the source of the 269 263 * callback. 264 + * @buffer_flags: Address where buffer flags are stored. Those are 265 + * used to report discontinuity users via DVB 266 + * memory mapped API, as defined by 267 + * &enum dmx_buffer_flags. 270 268 * 271 269 * This function callback prototype, provided by the client of the demux API, 272 270 * is called from the demux code. The function is only called when ··· 296 286 size_t buffer1_len, 297 287 const u8 *buffer2, 298 288 size_t buffer2_len, 299 - struct dmx_section_filter *source); 289 + struct dmx_section_filter *source, 290 + u32 *buffer_flags); 300 291 301 292 /* 302 293 * DVB Front-End
+4
include/media/dvb_demux.h
··· 115 115 * @pid: PID to be filtered. 116 116 * @timeout: feed timeout. 117 117 * @filter: pointer to &struct dvb_demux_filter. 118 + * @buffer_flags: Buffer flags used to report discontinuity users via DVB 119 + * memory mapped API, as defined by &enum dmx_buffer_flags. 118 120 * @ts_type: type of TS, as defined by &enum ts_filter_type. 119 121 * @pes_type: type of PES, as defined by &enum dmx_ts_pes. 120 122 * @cc: MPEG-TS packet continuity counter ··· 146 144 147 145 ktime_t timeout; 148 146 struct dvb_demux_filter *filter; 147 + 148 + u32 buffer_flags; 149 149 150 150 enum ts_filter_type ts_type; 151 151 enum dmx_ts_pes pes_type;
+16 -2
include/media/dvb_vb2.h
··· 85 85 * @nonblocking: 86 86 * If different than zero, device is operating on non-blocking 87 87 * mode. 88 + * @flags: buffer flags as defined by &enum dmx_buffer_flags. 89 + * Filled only at &DMX_DQBUF. &DMX_QBUF should zero this field. 90 + * @count: monotonic counter for filled buffers. Helps to identify 91 + * data stream loses. Filled only at &DMX_DQBUF. &DMX_QBUF should 92 + * zero this field. 93 + * 88 94 * @name: name of the device type. Currently, it can either be 89 95 * "dvr" or "demux_filter". 90 96 */ ··· 106 100 int buf_siz; 107 101 int buf_cnt; 108 102 int nonblocking; 103 + 104 + enum dmx_buffer_flags flags; 105 + u32 count; 106 + 109 107 char name[DVB_VB2_NAME_MAX + 1]; 110 108 }; 111 109 ··· 124 114 return 0; 125 115 }; 126 116 #define dvb_vb2_is_streaming(ctx) (0) 127 - #define dvb_vb2_fill_buffer(ctx, file, wait) (0) 117 + #define dvb_vb2_fill_buffer(ctx, file, wait, flags) (0) 128 118 129 119 static inline __poll_t dvb_vb2_poll(struct dvb_vb2_ctx *ctx, 130 120 struct file *file, ··· 163 153 * @ctx: control struct for VB2 handler 164 154 * @src: place where the data is stored 165 155 * @len: number of bytes to be copied from @src 156 + * @buffer_flags: 157 + * pointer to buffer flags as defined by &enum dmx_buffer_flags. 158 + * can be NULL. 166 159 */ 167 160 int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx, 168 - const unsigned char *src, int len); 161 + const unsigned char *src, int len, 162 + enum dmx_buffer_flags *buffer_flags); 169 163 170 164 /** 171 165 * dvb_vb2_poll - Wrapper to vb2_core_streamon() for Digital TV