[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