Advertisement
Guest User

Untitled

a guest
Dec 15th, 2013
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. From 120e44f817d73572d14a3db4af24a3d517aaacd8 Mon Sep 17 00:00:00 2001
  2. From: Joakim Plate <elupus@ecce.se>
  3. Date: Sat, 14 Dec 2013 14:55:13 +0100
  4. Subject: [PATCH 1/1] mpegts: stop analyzing when pmt for all programs have
  5. been found
  6.  
  7. This disables NOHEADER after finding PMT for all programs to
  8. avoid find_stream_info always exhausting probe size for mpegts.
  9.  
  10. This is very important for live streams since read speed
  11. will be limited. rtsp, udp and any protocol streaming a live
  12. mpegts will have dramatically faster startup time.
  13.  
  14. Note, lack of codec parameters for streams can still cause
  15. the full probe size to be exhausted.
  16. ---
  17. libavformat/mpegts.c | 54 +++++++++++++++++++++++++++++++++++++++++++---------
  18. 1 file changed, 45 insertions(+), 9 deletions(-)
  19.  
  20. diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
  21. index d67c63a..fa92fb7 100644
  22. --- a/libavformat/mpegts.c
  23. +++ b/libavformat/mpegts.c
  24. @@ -90,6 +90,9 @@ struct Program {
  25. unsigned int id; //program id/service id
  26. unsigned int nb_pids;
  27. unsigned int pids[MAX_PIDS_PER_PROGRAM];
  28. +
  29. + /** have we found pmt for this program */
  30. + int pmt_found;
  31. };
  32.  
  33. struct MpegTSContext {
  34. @@ -205,6 +208,17 @@ typedef struct PESContext {
  35.  
  36. extern AVInputFormat ff_mpegts_demuxer;
  37.  
  38. +static struct Program * get_program(MpegTSContext *ts, unsigned int programid)
  39. +{
  40. + int i;
  41. + for(i=0; i<ts->nb_prg; i++) {
  42. + if(ts->prg[i].id == programid) {
  43. + return &ts->prg[i];
  44. + }
  45. + }
  46. + return NULL;
  47. +}
  48. +
  49. static void clear_avprogram(MpegTSContext *ts, unsigned int programid)
  50. {
  51. AVProgram *prg = NULL;
  52. @@ -225,8 +239,10 @@ static void clear_program(MpegTSContext *ts, unsigned int programid)
  53.  
  54. clear_avprogram(ts, programid);
  55. for(i=0; i<ts->nb_prg; i++)
  56. - if(ts->prg[i].id == programid)
  57. + if(ts->prg[i].id == programid) {
  58. ts->prg[i].nb_pids = 0;
  59. + ts->prg[i].pmt_found = 0;
  60. + }
  61. }
  62.  
  63. static void clear_programs(MpegTSContext *ts)
  64. @@ -245,19 +261,13 @@ static void add_pat_entry(MpegTSContext *ts, unsigned int programid)
  65. p = &ts->prg[ts->nb_prg];
  66. p->id = programid;
  67. p->nb_pids = 0;
  68. + p->pmt_found = 0;
  69. ts->nb_prg++;
  70. }
  71.  
  72. static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned int pid)
  73. {
  74. - int i;
  75. - struct Program *p = NULL;
  76. - for(i=0; i<ts->nb_prg; i++) {
  77. - if(ts->prg[i].id == programid) {
  78. - p = &ts->prg[i];
  79. - break;
  80. - }
  81. - }
  82. + struct Program *p = get_program(ts, programid);
  83. if(!p)
  84. return;
  85.  
  86. @@ -266,6 +276,15 @@ static void add_pid_to_pmt(MpegTSContext *ts, unsigned int programid, unsigned i
  87. p->pids[p->nb_pids++] = pid;
  88. }
  89.  
  90. +static void set_pmt_found(MpegTSContext *ts, unsigned int programid)
  91. +{
  92. + struct Program *p = get_program(ts, programid);
  93. + if(!p)
  94. + return;
  95. +
  96. + p->pmt_found = 1;
  97. +}
  98. +
  99. static void set_pcr_pid(AVFormatContext *s, unsigned int programid, unsigned int pid)
  100. {
  101. int i;
  102. @@ -1590,6 +1609,8 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
  103. if (!ts->stream->nb_streams)
  104. ts->stop_parse = 2;
  105.  
  106. + set_pmt_found(ts, h->id);
  107. +
  108. for(;;) {
  109. st = 0;
  110. pes = NULL;
  111. @@ -1912,6 +1933,21 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
  112. p, p_end - p, 0);
  113. }
  114. }
  115. +
  116. + // stop find_stream_info from waiting for more streams
  117. + // when all programs have received a PMT
  118. + if( ts->stream->ctx_flags & AVFMTCTX_NOHEADER) {
  119. + int i;
  120. + for(i=0; i<ts->nb_prg; i++) {
  121. + if (!ts->prg[i].pmt_found)
  122. + break;
  123. + }
  124. + if (i == ts->nb_prg && ts->nb_prg > 0) {
  125. + av_log(ts->stream, AV_LOG_DEBUG, "All programs have pmt, headers found\n");
  126. + ts->stream->ctx_flags &= ~AVFMTCTX_NOHEADER;
  127. + }
  128. + }
  129. +
  130. } else {
  131. int ret;
  132. int64_t pcr = -1;
  133. --
  134. 1.8.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement