[Libav-user] NULL pointer using boost asio and many streaming object

Georgi Rosenov Stefanov georgi.rosenov at gmail.com
Wed Apr 8 14:54:53 CEST 2015


Hi again.

Today I made some simpler code and retested
I have a crash and a core file

Here is the backtrace:
Program terminated with signal SIGSEGV, Segmentation fault.
#0  __memcpy_ssse3_rep () at
../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S:1299
1299    ../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S: No such file or
directory.
(gdb) bt
#0  __memcpy_ssse3_rep () at
../sysdeps/i386/i686/multiarch/memcpy-ssse3-rep.S:1299
#1  0x080acc14 in avio_read (s=0xb156be0, buf=0xb1c0189d "", size=16471) at
libavformat/aviobuf.c:570
#2  0x081a35ba in append_packet_chunked (s=0xb156be0, pkt=0xb4801238,
size=21644) at libavformat/utils.c:223
#3  0x0810a067 in mov_read_packet (s=0xb1579a0, pkt=0xb4801238) at
libavformat/mov.c:4235
#4  0x081a4962 in ff_read_packet (s=0xb1579a0, pkt=0xb4801238) at
libavformat/utils.c:665
#5  0x081a7e99 in read_frame_internal (s=s at entry=0xb1579a0,
pkt=pkt at entry=0x917b180
<pkt+576>) at libavformat/utils.c:1318
#6  0x081a8ea3 in av_read_frame (s=<optimized out>, pkt=0x917b180
<pkt+576>) at libavformat/utils.c:1529
#7  0x080952f8 in worker_thread (Param=0xbfa4c650) at videogw.c:51
#8  0xb72e0efb in start_thread (arg=0xb4801b40) at pthread_create.c:309
#9  0xb721962e in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:129


Mine source code is:

/*
 * Copyright (c) 2013 Stefano Sabatini
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
copy
 * of this software and associated documentation files (the "Software"), to
deal
 * in the Software without restriction, including without limitation the
rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/**
 * @file
 * libavformat/libavcodec demuxing and muxing API example.
 *
 * Remux streams from one container format to another.
 * @example remuxing.c
 */

#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
#include <pthread.h>
#include <unistd.h>

#define MAX 10

AVOutputFormat *ofmt[MAX];
AVFormatContext *ifmt_ctx[MAX], *ofmt_ctx[MAX];
int video_idx[MAX];
AVPacket pkt[MAX];

void* worker_thread(void *Param)
{
    int id = *((int*)Param);
    int idx = video_idx[id];
    int ret;

    while (1)
    {
        ret = av_read_frame(ifmt_ctx[id], &pkt[id]);
        if (ret < 0)
            break;

        if (pkt[id].stream_index != idx)
            continue;

        AVStream *in_stream  = ifmt_ctx[id]->streams[pkt[id].stream_index];
        AVStream *out_stream = ofmt_ctx[id]->streams[pkt[id].stream_index];

        AVRational time_base = ifmt_ctx[id]->streams[idx]->time_base;

        int time = 1000 * 1000 * strtof(av_ts2timestr(pkt[id].duration,
&time_base), NULL);
        usleep(time);

        pkt[id].pts = av_rescale_q_rnd(pkt[id].pts, in_stream->time_base,
out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
        pkt[id].dts = av_rescale_q_rnd(pkt[id].dts, in_stream->time_base,
out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
        pkt[id].duration = av_rescale_q(pkt[id].duration,
in_stream->time_base, out_stream->time_base);
        pkt[id].pos = -1;

        ret = av_interleaved_write_frame(ofmt_ctx[id], &pkt[id]);
        if (ret < 0)
        {
            fprintf(stderr, "Error muxing packet thread %d\n", id);
            break;
        }

        av_free_packet(&pkt[id]);
    }
}

int main(int argc, char **argv)
{
    char *in_filename, out_filename[22];
    int ret, i = 0;

    memset(ofmt, 0, sizeof(ofmt));
    memset(ofmt_ctx, 0, sizeof(ofmt_ctx));
    memset(ifmt_ctx, 0, sizeof(ifmt_ctx));
    memset(video_idx, -1, sizeof(video_idx));

    in_filename  = "/home/georgi/Downloads/video/IMG_0019.MOV";

    av_register_all();
    avformat_network_init();

    for (i = 0; i < MAX; i++)
    {
        fprintf(stdout, "%d\n", i);

        if ((ret = avformat_open_input(&ifmt_ctx[i], in_filename, 0, 0)) <
0)
        {
            fprintf(stderr, "Could not open input file '%s'", in_filename);
            goto end;
        }

        if ((ret = avformat_find_stream_info(ifmt_ctx[i], 0)) < 0)
        {
            fprintf(stderr, "Failed to retrieve input stream information");
            goto end;
        }

        ifmt_ctx[i]->flags |= AVFMT_FLAG_GENPTS;

        sprintf(out_filename,"rtp://10.101.3.60:%d", 9078 + i);

        avformat_alloc_output_context2(&ofmt_ctx[i], NULL, "rtp",
out_filename);

        if (!ofmt_ctx[i])
        {
            fprintf(stderr, "Could not create output context\n");
            ret = AVERROR_UNKNOWN;
            goto end;
        }

        ofmt[i] = ofmt_ctx[i]->oformat;

        int k;
        for (k = 0; k < ifmt_ctx[i]->nb_streams; k++)
        {
            if (ifmt_ctx[i]->streams[k]->codec->codec_type ==
AVMEDIA_TYPE_VIDEO)
            {
                AVStream *in_stream = ifmt_ctx[i]->streams[k];
                AVStream *out_stream = avformat_new_stream(ofmt_ctx[i],
in_stream->codec->codec);
                if (!out_stream)
                {
                    fprintf(stderr, "Failed allocating output stream\n");
                    ret = AVERROR_UNKNOWN;
                    goto end;
                }

                ret = avcodec_copy_context(out_stream->codec,
in_stream->codec);
                if (ret < 0)
                {
                    fprintf(stderr, "Failed to copy context from input to
output stream codec context\n");
                    goto end;
                }
                out_stream->codec->codec_tag = 0;
                if (ofmt_ctx[i]->oformat->flags & AVFMT_GLOBALHEADER)
                    out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;

                video_idx[i] = k;
            }
        }

        if (!(ofmt[i]->flags & AVFMT_NOFILE))
        {
            ret = avio_open(&ofmt_ctx[i]->pb, out_filename,
AVIO_FLAG_WRITE);
            if (ret < 0)
            {
                fprintf(stderr, "Could not open output file '%s'",
out_filename);
                goto end;
            }
        }

        ret = avformat_write_header(ofmt_ctx[i], NULL);
        if (ret < 0)
        {
            fprintf(stderr, "Error occurred when opening output file\n");
            goto end;
        }
    }

    pthread_t thread_ids[MAX];
    for (i = 0; i < MAX; i++)
    {
        if ( 0 != pthread_create(&thread_ids[i], NULL, &worker_thread,
(void*)&i) )
        {
            fprintf(stderr, "Could not create thread %d\n", i);
            break;
        }
    }

    for (i = 0; i < MAX; i++)
    {
        pthread_join(thread_ids[i], NULL);
    }

end:

    for (i = 0; i < MAX; i++)
    {
        av_write_trailer(ofmt_ctx[i]);

        avformat_close_input(&ifmt_ctx[i]);

        /* close output */
        if (ofmt_ctx[i] && !(ofmt[i]->flags & AVFMT_NOFILE))
            avio_closep(&ofmt_ctx[i]->pb);

        avformat_free_context(ofmt_ctx[i]);

        if (ret < 0 && ret != AVERROR_EOF)
        {
            fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
            return 1;
        }
    }

    return 0;
}

Is this a bug in ffmpeg or I do not use it the right way ?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20150408/64cd14c2/attachment.html>


More information about the Libav-user mailing list