<div dir="auto"><div dir="ltr"><div data-smartmail="gmail_signature">Hi</div><div data-smartmail="gmail_signature" dir="auto"><br></div><div data-smartmail="gmail_signature">I am working on a streaming video application with a client and a server. </div><div data-smartmail="gmail_signature"><br></div><div data-smartmail="gmail_signature">My transport stream contains HEVC, AAC and a customdata track. </div><div data-smartmail="gmail_signature"><br></div><div data-smartmail="gmail_signature">In the server I am using these settings on the data stream.</div><div><br></div><div>codec_type = AVMEDIA_TYPE_DATA;<br><div>codec_id = AV_CODEC_ID_BIN_DATA; </div><div></div></div><div><br></div><div>The data is a small byte chunk sent for every frame with some parameters relating to the video. Fixed size 38bytes. Video, audio and data pass through the demuxer unharmed.<br></div><div><br></div><div><div><div>But, I am experiencing that my AVFormatContext returns the first ~20 packages within rrecieving the first 18000 bytes. Then it stalls for almost 2.8MB before returning the following packages.</div></div></div><div dir="auto"><br></div><div dir="auto">It must be noted that I use an AVIOContext to feed the data into the AVFormatContext.</div><div dir="auto"><br></div><div dir="auto">When debugging I have tried some changes and found that;</div><div><br></div><div>If I dont inject the actual data packets there is much less delay. So I suspect my problem has something to do with me triggering some analysis of the stream with my data packets. </div><div><br></div><div>Is there a way to tell the AVFormatContext what the contents of the stream is, so I can get data from the stream with as little delay as posible?</div><div><br></div><div>I have added my test setup below, where the socket is replaced with a chunkwise data feeder.</div><div><br></div><div>kind regards</div><div><br></div><div>Jesper</div><div data-smartmail="gmail_signature"><br></div><div data-smartmail="gmail_signature"><br></div><div data-smartmail="gmail_signature"><div style="color:rgb(212,212,212);background-color:rgb(30,30,30);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback";font-size:14px;line-height:19px;white-space:pre-wrap"><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><stdio.h></span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><queue></span></div><br><br><div><span style="color:rgb(197,134,192)">using</span> <span style="color:rgb(86,156,214)">namespace</span> <span style="color:rgb(78,201,176)">std</span>;</div><br><div><span style="color:rgb(197,134,192)">#define</span><span style="color:rgb(86,156,214)"> __STDC_CONSTANT_MACROS</span></div><br><div><span style="color:rgb(86,156,214)">extern</span> <span style="color:rgb(206,145,120)">"C"</span> {</div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavutil/avassert.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavutil/channel_layout.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavutil/opt.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavutil/mathematics.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavutil/timestamp.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavformat/avformat.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libswscale/swscale.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libswresample/swresample.h></span></div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><libavutil/file.h></span></div><div>}</div><br><div><span style="color:rgb(86,156,214)">struct</span> <span style="color:rgb(78,201,176)">Packet</span>{</div><div>    <span style="color:rgb(86,156,214)">uint8_t</span>* data;</div><div>    <span style="color:rgb(86,156,214)">uint64_t</span> len;</div><div>};</div><br><div>queue<Packet*> Q;</div><div><span style="color:rgb(86,156,214)">static</span> <span style="color:rgb(86,156,214)">int</span> x = <span style="color:rgb(181,206,168)">0</span>;</div><div><span style="color:rgb(86,156,214)">uint64_t</span> bc = <span style="color:rgb(181,206,168)">0</span>;</div><div><span style="color:rgb(86,156,214)">static</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(220,220,170)">read_packet</span>(<span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(86,156,214)">*</span><span style="color:rgb(156,220,254)">opaque</span>, <span style="color:rgb(86,156,214)">uint8_t</span> <span style="color:rgb(86,156,214)">*</span><span style="color:rgb(156,220,254)">buf</span>, <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">buf_size</span>)</div><div>{</div><div>    <span style="color:rgb(86,156,214)">int</span> r = <span style="color:rgb(181,206,168)">0</span>;</div><br><div><span style="color:rgb(106,153,85)">    //printf("x:%d %llu\r\n", x++, bc);</span></div><div>    <span style="color:rgb(197,134,192)">if</span>(x == <span style="color:rgb(181,206,168)">35</span>)</div><div>    {</div><div>        <span style="color:rgb(86,156,214)">int</span> x;</div><div>        x = <span style="color:rgb(181,206,168)">2</span>;</div><div>    }</div><div>    <span style="color:rgb(197,134,192)">if</span>(<span style="color:rgb(156,220,254)">Q</span>.<span style="color:rgb(220,220,170)">size</span>() > <span style="color:rgb(181,206,168)">0</span>)</div><div>    {</div><div>        Packet* p = <span style="color:rgb(156,220,254)">Q</span>.<span style="color:rgb(220,220,170)">front</span>();</div><div>        <span style="color:rgb(197,134,192)">if</span>(<span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span> > buf_size)</div><div>        {</div><div><span style="color:rgb(106,153,85)">            //printf("Cut\r\n");</span></div><div>            <span style="color:rgb(220,220,170)">memcpy</span>(buf, <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span>, buf_size);</div><div>            <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span> -= buf_size;</div><div>            <span style="color:rgb(86,156,214)">uint8_t</span>* new_data = (<span style="color:rgb(86,156,214)">uint8_t</span>*)<span style="color:rgb(220,220,170)">malloc</span>(<span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span>);</div><div>            <span style="color:rgb(220,220,170)">memcpy</span>(new_data, &<span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span>[buf_size], <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span>);</div><div>            <span style="color:rgb(220,220,170)">free</span>(<span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span>);</div><div>            <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span> = new_data;</div><div>            r = buf_size; </div><div>        }</div><div>        <span style="color:rgb(197,134,192)">else</span></div><div>        {</div><div><span style="color:rgb(106,153,85)">            //printf("Full\r\n");</span></div><div>            <span style="color:rgb(220,220,170)">memcpy</span>(buf, <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span>, <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span>);</div><div>            <span style="color:rgb(220,220,170)">free</span>(<span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span>);</div><div>            r = <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span>;</div><div>            <span style="color:rgb(156,220,254)">Q</span>.<span style="color:rgb(220,220,170)">pop</span>();</div><div>            <span style="color:rgb(220,220,170)">free</span>(p);</div><div>        }</div><br><div>        </div><div>    }</div><div>    bc += r;</div><div>    <span style="color:rgb(197,134,192)">return</span> r;</div><div>}</div><br><br><br><div><span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(220,220,170)">main</span>(<span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">argc</span>, <span style="color:rgb(86,156,214)">char*</span> <span style="color:rgb(156,220,254)">argv</span>[])</div><div>{</div><div>    <span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"Hello world...</span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>);</div><br><div>    <span style="color:rgb(86,156,214)">static</span> AVFormatContext *fmt_ctx = <span style="color:rgb(86,156,214)">NULL</span>;</div><div><span style="color:rgb(106,153,85)">    //fmt_ctx->flags |= AVFMT_FLA</span></div><br><div><span style="color:rgb(106,153,85)">    //Read file data into queue packets</span></div><div>    FILE* f = <span style="color:rgb(220,220,170)">fopen</span>(<span style="color:rgb(206,145,120)">"customdata.ts"</span>, <span style="color:rgb(206,145,120)">"rb"</span>);</div><div><span style="color:rgb(86,156,214)">    </span><span style="color:rgb(197,134,192)">#define</span><span style="color:rgb(86,156,214)"> BUF_SIZE </span><span style="color:rgb(181,206,168)">1000</span></div><div>    <span style="color:rgb(86,156,214)">uint8_t</span> <span style="color:rgb(156,220,254)">b</span>[BUF_SIZE];</div><div>    <span style="color:rgb(197,134,192)">while</span>(<span style="color:rgb(181,206,168)">1</span>)</div><div>    {</div><div>        <span style="color:rgb(86,156,214)">int</span> l = <span style="color:rgb(220,220,170)">fread</span>(b, <span style="color:rgb(181,206,168)">1</span>, BUF_SIZE, f);</div><div>        <span style="color:rgb(197,134,192)">if</span>(l <= <span style="color:rgb(181,206,168)">0</span>)</div><div>        {</div><div>            <span style="color:rgb(197,134,192)">break</span>;</div><div>        }</div><div>        Packet* p = (Packet*)<span style="color:rgb(220,220,170)">malloc</span>(<span style="color:rgb(86,156,214)">sizeof</span>(Packet));</div><div>        <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span> = (<span style="color:rgb(86,156,214)">uint8_t</span>*)<span style="color:rgb(220,220,170)">malloc</span>(l);</div><div>        <span style="color:rgb(220,220,170)">memcpy</span>((<span style="color:rgb(86,156,214)">void</span>*)<span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">data</span>, (<span style="color:rgb(86,156,214)">void</span>*)b, l);</div><div>        <span style="color:rgb(156,220,254)">p</span>-><span style="color:rgb(156,220,254)">len</span> = l;</div><div>        <span style="color:rgb(156,220,254)">Q</span>.<span style="color:rgb(220,220,170)">push</span>(p);</div><div>    }</div><div>    <span style="color:rgb(220,220,170)">fclose</span>(f);</div><div>    <span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"File read into %d chunks</span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>, <span style="color:rgb(156,220,254)">Q</span>.<span style="color:rgb(220,220,170)">size</span>());</div><br><div>    </div><br><div>   <span style="color:rgb(197,134,192)">if</span> (!(fmt_ctx = <span style="color:rgb(220,220,170)">avformat_alloc_context</span>())) {</div><div>        <span style="color:rgb(220,220,170)">fprintf</span>(stderr, <span style="color:rgb(206,145,120)">"Could not allocate fmt_ctx</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>        <span style="color:rgb(220,220,170)">exit</span>(<span style="color:rgb(181,206,168)">1</span>);</div><div>    }</div><br><div>    <span style="color:rgb(86,156,214)">size_t</span> avio_ctx_buffer_size = <span style="color:rgb(181,206,168)">4096</span>;</div><br><div>    <span style="color:rgb(86,156,214)">uint8_t</span>* avio_ctx_buffer = (<span style="color:rgb(86,156,214)">uint8_t</span>*)<span style="color:rgb(220,220,170)">av_malloc</span>(avio_ctx_buffer_size);</div><div>    <span style="color:rgb(197,134,192)">if</span> (!avio_ctx_buffer) {</div><div>        <span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"error allocating avio_ctx_buffer</span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>        <span style="color:rgb(220,220,170)">exit</span>(<span style="color:rgb(181,206,168)">0</span>);</div><div>    }</div><br><div>    AVIOContext* avio_ctx = <span style="color:rgb(220,220,170)">avio_alloc_context</span>(avio_ctx_buffer, avio_ctx_buffer_size, <span style="color:rgb(181,206,168)">0</span>,  <span style="color:rgb(86,156,214)">NULL</span>, &read_packet, <span style="color:rgb(86,156,214)">NULL</span>, <span style="color:rgb(86,156,214)">NULL</span>);</div><br><div>    <span style="color:rgb(197,134,192)">if</span> (!avio_ctx) {</div><div>        <span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"error allocating avio_ctx</span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>        <span style="color:rgb(220,220,170)">exit</span>(<span style="color:rgb(181,206,168)">0</span>);</div><div>    }</div><div>    </div><div>    <span style="color:rgb(156,220,254)">fmt_ctx</span>-><span style="color:rgb(156,220,254)">pb</span> = avio_ctx;</div><br><br><br><br><div>    AVInputFormat *inputFormat = <span style="color:rgb(220,220,170)">av_find_input_format</span>(<span style="color:rgb(206,145,120)">"mpegts"</span>);</div><div>    AVDictionary *inOptions = <span style="color:rgb(86,156,214)">NULL</span>;</div><div>    <span style="color:rgb(220,220,170)">av_dict_set</span>(&inOptions, <span style="color:rgb(206,145,120)">"test"</span>,<span style="color:rgb(206,145,120)">"test"</span>, <span style="color:rgb(181,206,168)">0</span>);</div><div>    <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(220,220,170)">avformat_open_input</span>(&fmt_ctx, <span style="color:rgb(86,156,214)">NULL</span>, inputFormat, &inOptions) < <span style="color:rgb(181,206,168)">0</span>)</div><div>    {</div><div>        <span style="color:rgb(220,220,170)">fprintf</span>(stderr, <span style="color:rgb(206,145,120)">"Could not open source file </span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>        <span style="color:rgb(220,220,170)">exit</span>(<span style="color:rgb(181,206,168)">1</span>);</div><div>    }</div><br><div>    AVPacket pkt;</div><div>    <span style="color:rgb(220,220,170)">av_init_packet</span>(&pkt);</div><div>    <span style="color:rgb(156,220,254)">pkt</span>.<span style="color:rgb(156,220,254)">data</span> = <span style="color:rgb(86,156,214)">NULL</span>;</div><div>    <span style="color:rgb(156,220,254)">pkt</span>.<span style="color:rgb(156,220,254)">size</span> = <span style="color:rgb(181,206,168)">0</span>;</div><div>    <span style="color:rgb(86,156,214)">int</span> framecounter = <span style="color:rgb(181,206,168)">0</span>;</div><div>    <span style="color:rgb(197,134,192)">while</span>(<span style="color:rgb(220,220,170)">av_read_frame</span>(fmt_ctx, &pkt) >= <span style="color:rgb(181,206,168)">0</span>)</div><div>    {</div><div>        <span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"index %d  %llu %d</span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>, framecounter, bc, <span style="color:rgb(156,220,254)">pkt</span>.<span style="color:rgb(156,220,254)">stream_index</span>);</div><div>        <span style="color:rgb(220,220,170)">av_free_packet</span>(&pkt);  </div><div>        <span style="color:rgb(197,134,192)">if</span>(framecounter == <span style="color:rgb(181,206,168)">22</span>)</div><div>        {</div><div>            <span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"now somethin funny start</span><span style="color:rgb(215,186,125)">\r\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>        }</div><div>        <span style="color:rgb(197,134,192)">if</span>(framecounter++ > <span style="color:rgb(181,206,168)">100</span>)</div><div>        {</div><div>            <span style="color:rgb(197,134,192)">break</span>;</div><div>        }</div><div>    }</div><br><div>    <span style="color:rgb(197,134,192)">return</span> <span style="color:rgb(181,206,168)">0</span>;</div><div>}</div></div></div></div></div>