On Thu, Mar 15, 2018 at 4:54 AM, Michael IV <[email protected]> wrote:
> > > > > > > > > > > > > > *AVCodecParameters is for information that codecs need to do their workbut > is stored in a structured way in the container format rather thanencoded in > the bitstream. Codecs vary in what they need and what theyput in the > bitstream, and formats vary in what they are able to encode,but there is > enough common ground for quite a few fields > inAVCodecParameters.AVCodecContext is for actual encoding en decoding. It > needs theinformation from AVCodecParameters, but it also needs settings > that arespecific to the process at hand.Complaining that AVCodecParameters > does not have a flags field is likecomplaining that the TV magazine tells > you how to turn the volumebutton on your TV.* > > > Thanks you for this even more confusing explanation, Nicolas )) > It is as clear as the FFMPEG API ;) I guess,I am not working enough with > the av libs to completely understand those subtle ideas. > > > > _______________________________________________ > Libav-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/libav-user > > Hello. I tried posting a very long version of questions along these lines but it never made it to this list. This thread is so similar it's been revealing and I hopped on IRC to get a few answers confirmed. Here is my understanding, please feel free to correct me if I am wrong: AVCodecContext is everything a codec needs to encode video (including settings specific to the codec you're using). AVCodecParameters is more like the "header info" (like a bitmap header) shared for all codecs. Muxers and Demuxers will pretty much store this header info somewhere. The AVStream::codec deprecated threw me for a long time. But here is my new understanding (confirmed on IRC): For encoding: 1. Use avcodec_find_encoder_by_name result is AVCodec. 2. Pass that AVCodec to avformat_new_stream. The newly created AVStream will take the information from AVCodec and store it in its AVCodecParameters (AVStream::codecpar). 3. Create your own AVCodecContext. 4. Copy the parameters out of AVStream::codecpar into your own AVCodecContext using avcodec_parameters_to_context. 5. Configure your own AVCodecContext (in my case, using AVOptions). 6. Copy the newly configured parameters from AVCodecContext back to your AVStream::codecpar using avcodec_parameters_from_context. 7. Do all of your encoding using your AVCodecContext and forget that AVStream::codec ever existed. Given this workflow is the new blessed one, AVStream::codec must be unused. Poking at the source it looks like internally, it checks to see if AVStream::codecpar is mismatched with AVStream::codec, and if so, it prefers AVStream::codec by copying it again into AVStream::codecpar. However, all AVStream needs is AVStream::codecpar. Cheers.
_______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
