[Libav-user] Getting SPS and PPS-information from x264 encoding

Christian Brümmer itf-freak at gmx.de
Thu May 31 17:29:58 CEST 2012


Am 31.05.2012 15:51, schrieb Christian Brümmer:
> Am 30.05.2012 12:44, schrieb Christian Brümmer:
>> Am 30.05.2012 04:07, schrieb Kalileo:
>>> On May 29, 2012, at 20:26 , Christian Brümmer wrote:
>>>
>>>> "Cant be that hard - or?"
>>>>
>>>> Okay now im pretty sure it is:
>>>>
>>>> I read AVCodecContex.extradata contains the informations i need. For decoding i used that code ->  http://cgit.lscube.org/cgit.cgi/feng/tree/src/media/parser/h264.c#n218  - in a slightly modified way (replaced glib functions with e.g. libavs base64.h). Finally the decoding stuff is running - BUT...
>>>>
>>>> my AVCodecContext.extradata_size == 0<- what the heck?!? So no data for decoding and really no idea left how to get those informations.... WHAA!
>>>>
>>>> I make desperate efforts but i cant get into that...
>>>>
>>>> At least i need another hint. Im not asking for complete solution - its enough to know roughly the right way!
>>> > From what I think I understood extradata contains what you expect when your source is a video format with a global header.
>>>
>>> What's the source format you use for your tests?
>>>
>>>
>>> _______________________________________________
>>> Libav-user mailing list
>>> Libav-user at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/libav-user
>>>
>> I create dummy images (should be replaced later on) and encoding them 
>> to x264 frames. Further i stream those images via rtsp which is 
>> working on VLC but not on android and i thinks its a stream 
>> configuration problem.
>>
>> When should extradata be filled? In my text a dont encode a frame 
>> before i try to get the sps pps infos out of extradata. I may have to 
>> call a special function or encode a frame or header before?
>>
>> So my source format is:
>>
>>     codec = avcodec_find_encoder(c->codec_id);
>>     if(!codec)
>>     {
>>         std::cout << "Codec not found." << std::endl;
>>         std::cin.get();std::cin.get();exit(1);
>>     }
>>
>> *if(avcodec_get_context_defaults3 (c, codec) < 0) // cause i dont 
>> know a working x264 configuration without deprecated flags *
>>     {
>>         std::cout << "Cannot get default codec context! \n" << std::endl;
>>         std::cin.get();
>>         exit(1);
>>     }
>>
>> and
>>
>>     codec = stream->codec;
>>     codec->codec_id = codecID;
>>     codec->codec_type = AVMEDIA_TYPE_VIDEO;
>>     codec->bit_rate = mParameters.mBitRate;
>>     codec->width = mParameters.mWidth;
>>     codec->height = mParameters.mHeight;
>>     codec->time_base.den = mParameters.mFrameRate;
>>     codec->time_base.num = 1;
>>     codec->gop_size = mParameters.mFrameRate;
>>     codec->pix_fmt = PIXEL_FORMAT;
>>     codec->b_frame_strategy = 0;
>>     codec->level = 12;
>>     if(codec->codec_id == CODEC_ID_MPEG2VIDEO)
>>         codec->max_b_frames = 2; // for testing, B frames
>>
>>     if(codec->codec_id == CODEC_ID_MPEG1VIDEO)
>>         codec->mb_decision = 2;
>>
>>     if(context->oformat->flags & AVFMT_GLOBALHEADER)
>>         codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
>>
>> where mParamters are:
>>
>>   imLiveStreamParameters param;
>>   param.mBitRate = 4000;
>>   param.mCodec = "x264";
>>   param.mFrameRate = 24;
>>   param.mHeight = 240;
>>   param.mWidth = 320;
>>
>> Thank you for your reply!
>>
>>
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/libav-user
> I figured out that if i add  c->flags |= CODEC_FLAG_GLOBAL_HEADER; for 
> my video codec configuration AVCodecContext.extradata.size is bigger 
> than 0.
> Whats a reason for dont using global headers?
>
> Further i tried the av_sdp_create function again and now i get a 
> string containing "sprop-parameter-sets". My rtsp server accept the 
> sdp string but the vlc cant play my stream. But i will ask the live555 
> mailing list for that!
>
> Are there other aspects i have to consider using global header with 
> x264 encoding (other configurations)?
>
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user

I finally got it. The created sdp-line is working as expected. I had to 
create a substring and only parsing the "bytestream" of the 
sprop-parameter-sets without the qualifier "sprop-parameter-sets=". But 
thats nothing about libav.

Thanks for reading,
best regards,
Christian
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20120531/11cfe6b9/attachment.html>


More information about the Libav-user mailing list