On 07/04/14 22:21, Michael Rice wrote:
> I have setup an application to receive and decode an UDP video stream and
> it's working fine. During initialization, I loop through all of the streams
> in the AVFormatContext and use the first video stream, and I remember that
> stream index. As I'm looping to receive packets using av_read_frame(), I
> check the AVPacket.stream_index to make sure I only process packets with
> the same stream index I found during initialization. If it's the same
> stream index, I decode it and process it.
> 
> This all works fine, except in one circumstance. I'm using VLC to generate
> the UDP stream, and it's simply looping an input file. When VLC gets loops
> back to the beginning of the file, I don't get any error code returned from
> av_read_frame(), but the packet that it reads has a different stream_index;
> it is incremented by 1. Subsequently, my check to ensure I'm processing the
> correct stream will fail, because all of a sudden the packets have a new
> stream_index.

Are you using mpegts over UDP ? Does the different stream comes with a
different PID (check the st->id)?

> Is there some other indicator I can use to know this happened? I can put
> some code in to try and infer this condition, and start processing the new
> stream, but I would really much rather have a definitive indicator that the
> stream_index has changed for a reason.

mpegts must assume additional/different streams would appear over time.

> Here's some pseudo code showing what I'm doing:
> 
> AVFormatContext* fc = 0;
> AVCodecContext* cc = 0;
> AVCodec* codec = 0;
> int streamIndex = -1;
> initialize(char* url)
> {
>   fc = avformat_alloc_context();
>   avformat_open_input(&fc, url, 0, 0);
>   avformat_find_stream_info(fc, 0);
>   for(int index = 0; index < fc->nb_streams; ++index)
>   {
>     if(fc->streams[index]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
>     {
>       streamIndex = index;
>       cc = fc->streams[streamIndex]->codec;
>       codec = avcodec_find_decoder(cc->codec_id);
>       break;
>     }
>   }
>   if(codec == 0)
>   {
>     exit(0);
>   }
>   avcodec_open2(cc, codec, 0);
> }
> 
> readVideo()
> {
>   while(1)
>   {
>     AVPacket* packet = new AVPacket();
>     int readStatus = av_read_frame(fc, packet);
>     if(readStatus < 0)
>     {
>       // Do error handling
>     }
>     else
>     {
> // ----> This is where the AVPacket.stream_index shows up incremented after
> VLC loops the video

Check for the fc->streams[packet->stream_index]->id

>       if(packet->stream_index != streamIndex)
>       {
>         av_free_packet(packet);
>         continue;
>       }
> 
>       // ... continue to decode and process packet ...
>     }
>   }
> }

lu

_______________________________________________
libav-api mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-api

Reply via email to