On Thu, Sep 9, 2010 at 9:00 PM, Alex Grosu <[email protected]> wrote: > Hello Huy > > Thanks a lot for the answer. I found this solution 2 days ago, but first I > thought it was a dirty one. I wanted to check this before posting here > again, but you took it ahead. Your pointing shows me that in fact this is > not a dirty solution, so thanks a lot for support. > So, what I had to do (as Huy suggested), was to couple 7 8 and 5 NAL types > into only one buffer and to present it to libavcodec (in > avcodec_decode_video2 function). > Thus, using the [ and ] characters to delimit buffer boundaries, I was > coupling following before send them to libavcodec: > [7 8 5] [1] [1] [1] [1] [7 8 5] [1] [1] [1] and so on. > I don't receive errors anymore. Everything works now > > Thank you > > > Nhat Huy wrote: > >> On Thu, Sep 2, 2010 at 3:58 PM, Alex Grosu <[email protected]> wrote: >> >> >> >>> Hello >>> >>> I am currently decoding h264 streams (with libavcodec) and I am stuck >>> with >>> the logic for SPS (sequence parameter set) and PPS (picture parameter >>> set). >>> The board from which I am receiving the packages is sending a NAL unit in >>> each packet. The sequence for NAL types is: >>> 7(SPS) 8(PPS) 5 1 1 1 1 7 8 5 1 1 1... >>> I am putting in front of each NAL the start sequence 0x000001 and sending >>> this packet to avcodec_decode_video2. When 7 and 8 types are coming, I am >>> doing the same logic, but avcodec_decode_video2 is returning -1. After >>> this, >>> all the received NALs are decoded and the images are displayed. Every >>> time >>> when SPS and PPS are coming, avcodec_decode_video2 returns -1 (fails). I >>> searched all over the net , and I still can't understand how to fill up >>> the >>> extradata and extradata_size from AVCodecContext used. All I found is >>> this >>> link: http://www.mail-archive.com/[email protected]/msg04939.html. >>> As I saw from here: >>> "To decode H.264 stream you need to have SPS and PPS NAL units also .". >>> Ok, >>> I have them, but frankly I don't know how to use them. At first, I >>> thought >>> that avcodec_decode_video2 will "automatically" use them. But returning >>> -1, >>> I don't see how. Also, If I am discarding SPS and PPS from sending them >>> to >>> libavcodec, nothing is decoded anymore. >>> Can you please give me a hint? >>> Thank you a lot ! >>> _______________________________________________ >>> libav-user mailing list >>> [email protected] >>> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >>> >>> >>> >> >> >> Hi, >> >> I think you should read H.264 bit stream structure and use these tools to >> analyze a NAL unit of H.264 bitstream. >> http://www.codecian.com/ >> http://tsviatko.jongov.com/index_prj_h264videoesviewer.htm >> >> When FFmpeg decode a NAL unit, if the nal_unit_type equal 7,8 it will >> continue decode to find the IDR nal_unit. In your case, I think that >> FFmpeg >> found SPS, PPS but it can not find IDR thus it returns -1. >> >> Hope it helps. >> >> Huy. >> _______________________________________________ >> libav-user mailing list >> [email protected] >> https://lists.mplayerhq.hu/mailman/listinfo/libav-user >> >> >> > _______________________________________________ > libav-user mailing list > [email protected] > https://lists.mplayerhq.hu/mailman/listinfo/libav-user >
Hi, If you coupled H.264 slice as [7 8 5] [1] [1] [1] [1] [7 8 5] [1] [1] [1] and so on, it can work well only in single slice/ frame case. If you use multiple slice , it goes wrong. For ex. my sequence has 5 frame I B B B P, and number of slices is 4 per frame. The NAL_unit_type of bit stream is: [7 8 5 5 5 5][1 1 1 1][1 1 1 1][1 1 1 1][1 1 1 1] I use [ and ] to mark the frame boundary. When you feed avcodec_decode_video2, the input buffer must contains whole frame data. Thus, the problem that you have to calculate exactly the input buffer length, and feed it enough data plus some padding if necessary before pass it to avcodec_decode_video2. Huy. _______________________________________________ libav-user mailing list [email protected] https://lists.mplayerhq.hu/mailman/listinfo/libav-user
