Hi,

I'm trying to write a small C program to convert a given file from
MPEG-4 to MPEG-2.  This will then be ported to Java (via Swig) and
integrated into an existing program, but I'm stumbling at segfaults.
I'm largely working from http://www.dranger.com/ffmpeg/tutorial01.html
, but it does not cover writing new files, so I am coding a little
blind.

If you have any suggestions, please let me have them.

ri...@ricky-desktop:~$ cd ffmpegplay/
ri...@ricky-desktop:~/ffmpegplay$ ls
a.out  build.sh  build.sh~  test.c  test.c~
ri...@ricky-desktop:~/ffmpegplay$ cat build.sh
#!/bin/bash

gcc -std=c99 -I ~/ffmpeg/libavcodec/ -I ~/ffmpeg/libavformat/ -I
~/ffmpeg -L ~/ffmpeg/ -L ~/ffmpeg/libavformat/ -L ~/ffmpeg/libavcodec/
-L ~/ffmpeg/libavutil/ test.c -l avformat -l avcodec -l avutil -l
avformat -l avcodec -l avutil -l m -l
zri...@ricky-desktop:~/ffmpegplay$
ri...@ricky-desktop:~/ffmpegplay$ cat build.sh
#!/bin/bash

gcc -std=c99 -I ~/ffmpeg/libavcodec/ -I ~/ffmpeg/libavformat/ -I
~/ffmpeg -L ~/ffmpeg/ -L ~/ffmpeg/libavformat/ -L ~/ffmpeg/libavcodec/
-L ~/ffmpeg/libavutil/ test.c -l avformat -l avcodec -l avutil -l
avformat -l avcodec -l avutil -l m -l z
ri...@ricky-desktop:~/ffmpegplay$ cat test.c
#include "avcodec.h"
#include "avformat.h"
#include "imgconvert.h"
#include "stdio.h"

int main(int argc, char **argv) {
    av_register_all();
    AVFormatContext *formatContext;
    if (av_open_input_file(&formatContext, argv[1], NULL, 0, NULL)!=0)
        return -1;
    if (av_find_stream_info(formatContext) < 0)
        return -2;
    dump_format(formatContext, 0, argv[1], 0);
    AVCodecContext *codecContext;
    int videoStream = -1;
    for (int i = 0; i < formatContext->nb_streams; i++)
        if (formatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) {
            videoStream = i;
            break;
        }
    if (videoStream == -1)
        return -3;
    codecContext = formatContext->streams[videoStream]->codec;
    AVOutputFormat *outputFormat = guess_format(NULL, argv[2], NULL);
    if (outputFormat == NULL)
        return -4;
    AVFormatContext *outputFormatContext = av_alloc_format_context();
    outputFormatContext->oformat = outputFormat;
    strcpy(outputFormatContext->filename, argv[2]);
    AVStream *outputStream;
    av_new_stream(outputFormatContext, 0);
    AVCodecContext *outputCodecContext;
    outputCodecContext = outputStream->codec;
    outputCodecContext->codec_id = CODEC_ID_MPEG2VIDEO;
    outputCodecContext->codec_type = CODEC_TYPE_VIDEO;
    outputCodecContext->width = 640;
    outputCodecContext->height = 256;
    outputCodecContext->bit_rate = 4000000;
    outputCodecContext->time_base.num = 1;
    outputCodecContext->time_base.den = 25;
    outputCodecContext->pix_fmt = PIX_FMT_YUV420P;
    outputCodecContext->flags = outputCodecContext->flags |
CODEC_FLAG_GLOBAL_HEADER;
    outputCodecContext->gop_size = 12;
    outputCodecContext->me_method = ME_ZERO;
    AVCodec *encodeCodec = avcodec_find_encoder( outputCodecContext->codec_id );
    avcodec_open( outputCodecContext, encodeCodec );
    AVCodec *decodeCodec = avcodec_find_decoder( codecContext->codec_id );
    if ( decodeCodec == NULL ) return -5;
    AVFrame *frame = avcodec_alloc_frame();
    AVFrame *frameRGB = avcodec_alloc_frame();
    uint8_t *buffer;
    int numBytes;
    // Determine required buffer size and allocate buffer
    numBytes=avpicture_get_size(PIX_FMT_RGB24, codecContext->width,
                                codecContext->height);
    buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
    avpicture_fill((AVPicture *)frame, buffer, PIX_FMT_RGB24,
                   codecContext->width, codecContext->height);
    int frameFinished;
    AVPacket packet;

    int i=0;
    while (av_read_frame(formatContext, &packet)>=0) {
        if(packet.stream_index==videoStream) {
            avcodec_decode_video(codecContext, frame, &frameFinished,
                                 packet.data, packet.size);

            if(frameFinished) {
                img_convert((AVPicture *)frameRGB, PIX_FMT_RGB24,
                            (AVPicture*)frame, outputCodecContext->pix_fmt,
                            outputCodecContext->width,
outputCodecContext->height);

                if (av_interleaved_write_frame(outputFormatContext,
&packet) < 0)
                    return -6;
            }
        }

        av_free_packet(&packet);
    }

    return 0;
}
ri...@ricky-desktop:~/ffmpegplay$ ./build.sh
test.c: In function "main":
test.c:27: warning: "av_alloc_format_context" is deprecated (declared
at /home/ricky/ffmpeg/libavformat/avformat.h:873)
ri...@ricky-desktop:~/ffmpegplay$ file ~/cavity_flow_movie.mp4
/home/ricky/cavity_flow_movie.mp4: ISO Media, MPEG v4 system, version 2
ri...@ricky-desktop:~/ffmpegplay$ ./a.out ~/cavity_flow_movie.mp4
~/cavity_flow_movie.mp2
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/ricky/cavity_flow_movie.mp4':
  Duration: 00:00:41.66, start: 0.000000, bitrate: 2301 kb/s
    Stream #0.0(eng): Video: mpeg4, yuv420p, 320x240 [PAR 1:1 DAR
4:3], 30.00 tb(r)
    Stream #0.1(eng): Data: mp4s / 0x7334706D
    Stream #0.2(eng): Data: mp4s / 0x7334706D
Segmentation fault

-- 
Ricky Clarkson
Java Programmer, AD Holdings
+44 1565 770804
Skype: ricky_clarkson
Google Talk: [email protected]
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to