丫叩酱 发表于 2013-05-23 15:23

264解码中遇到的getNextNal问题

刚刚接触到FFmpeg,测试第一个例子264解码,如下。

Q1:在第4步中:4.获取下一个NAL的长度,并且将NAL放入Buf,getNextNal函数的原型在哪里可以找到,包含该函数的头文件在哪里,需要用到库文件,若需要,需要哪个库文件?

搜索了好久,都没找到关于getNextNal的信息。

运行到此处,程序报告错误信息:

                  test.c:76: warning: implicit declaration of function ‘getNextNal’

                  test.c:76: undefined reference to `getNextNal'

还请大家多多帮忙。Decode()
{
        FILE *inpf;

        int nWrite;
        int i, p;
        int nalLen;
        unsigned char *Buf;
        int got_picture, consumed_bytes;
        unsigned char *DisplayBuf;

        DisplayBuf = (unsigned char *)malloc(60000);

        char outfile[] = "test.pgm";

        //1.打开输入文件
        inpf = fopen("test.264", "rb");

        //outf = fopen("out.yuv", "wb");

        if(!inpf)
        {
                        goto Decodereturn;
        }

        nalLen = 0;
        //准备解码文件缓冲
        Buf = (unsigned char *)calloc(100000, sizeof(char));

        //2.注册解码器,并且找到H264解码器
        avcodec_init();
        avcodec_register_all();
        codec = avcodec_find_decoder(CODEC_ID_H264);

        if(!codec)
        {
                return 0;
        }

        //open codec
        //3.打开解码器
        if(avcodec_open(c, codec) < 0)
        {
                return 0;
        }

        //allocate codec context
        //分配解码器内存
        picture = avcodec_alloc_frame();
        if(!picture)
        {
                return 0;
        }

        rgbdatanew = (unsigned char *)malloc(sizeof(unsigned char) * (3 * width * height));

        while(!feof(inpf))
        {
                //4.获取下一个NAL的长度,并且将NAL放入Buf
                nalLen = getNextNal(inpf, Buf);

                //5.对改NAL解码,解码的YUV数据存在picture中
                consumed_bytes = avcode_decode_video(c, picture, &got_picture, Buf, nalLen);
                if(consumed_bytes > 0)
                {
                        //6.将picture中的YUV数据显示或者保存到文件
                        p = 0;
                       
                        for(i = 0; i < c->height; i++)
                        {
                                memcpy(DisplayBuf + p, picture->data + i * picture->linesize, c->width);
                                p += c->width;
                        }

                        for(i = 0; i < (c->height / 2); i++)
                        {
                                memcpy(DisplayBuf + p, picture->data + i * picture->linesize, c->width / 2)
                                p += c->width / 2;
                        }

                        for(i = 0; i < (c->height / 2); i++)
                        {
                                memcpy(DisplayBuf + p, picture->data + i * picture->linesize, c->width / 2)
                                p += c->width / 2;
                        }

                        //显示画面
                        DisplayVideo(DisplayBuf);
                }
        }

        //7.关闭输入文件
        if(inpf)
        {
                fclose(inpf);
        }

Decodereturn:

        //8.关闭解码器,释放解码器内存
        if(c)
        {
                avcodec_close(c);
                av_free(c);
                c = NULL;
        }

        //9.释放解码器画面内存
        if(picture)
        {
                av_free(picture);
                picture = NULL;
        }

        //10.释放解码文件缓冲
        if(Buf)
        {
                free(Buf);
                Buf = NULL;
        }

        free(DisplayBuf);

}

丫叩酱 发表于 2013-05-23 16:58

太悲催了,网上百度出来的实例,竟然不是完整的,我还以为是引用库中的函数,谁知道是自定义函数,既然是给新手提供的,那就提供全点信息嘛。

不然像我似的,还在查找getNextNal函数的原型呐,:luya:

回复 1# 丫叩酱


   
页: [1]
查看完整版本: 264解码中遇到的getNextNal问题