[FFmpeg-trac] #4458(undetermined:new): Segmentation fault on usage of libraries

FFmpeg trac at avcodec.org
Wed Apr 8 15:06:16 CEST 2015


#4458: Segmentation fault on usage of libraries
---------------------------------------+----------------------------------
             Reporter:  georgidobrich  |                     Type:  defect
               Status:  new            |                 Priority:  normal
            Component:  undetermined   |                  Version:
             Keywords:                 |               Blocked By:
             Blocking:                 |  Reproduced by developer:  0
Analyzed by developer:  0              |
---------------------------------------+----------------------------------
 I have written a code which open 10 input and 10 rtp output context.
 Then I use 10 threads to read data from a file and to stream it over the
 network
 But I  got "segmentation fault" and a core file.

 The backtrace is:
 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


 The source coude I have used 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;
 }

--
Ticket URL: <https://trac.ffmpeg.org/ticket/4458>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list