ffmpeg index marker fix, layout fixes, quit deadlock fix
[goodguy/history.git] / cinelerra-5.1 / cinelerra / ffmpeg.C
index 37a999298b0487c9ce726015f61dfd616e97bba6..6c3789e84f5660672321a37837e72f0bddc56291 100644 (file)
@@ -240,7 +240,6 @@ FFStream::FFStream(FFMPEG *ffmpeg, AVStream *st, int fidx)
        nudge = AV_NOPTS_VALUE;
        seek_pos = curr_pos = 0;
        seeked = 1;  eof = 0;
-       index_markers = 0;
        reading = writing = 0;
        flushed = 0;
        need_packet = 1;
@@ -447,6 +446,7 @@ int FFStream::seek(int64_t no, double rate)
 // default ffmpeg native seek
        int npkts = 1;
        int64_t pos = no, plmt = -1;
+       IndexMarks *index_markers = get_markers();
        if( index_markers && index_markers->size() > 1 ) {
                IndexMarks &marks = *index_markers;
                int i = marks.find(pos);
@@ -703,11 +703,18 @@ int FFAudioStream::encode_frame(AVPacket *pkt, AVFrame *frame, int &got_packet)
 void FFAudioStream::load_markers()
 {
        IndexState *index_state = ffmpeg->file_base->asset->index_state;
-       if( index_state->marker_status == MARKERS_NOTTESTED ) return;
        if( !index_state || idx >= index_state->audio_markers.size() ) return;
+       if( index_state->marker_status == MARKERS_NOTTESTED ) return;
        FFStream::load_markers(*index_state->audio_markers[idx], sample_rate);
 }
 
+IndexMarks *FFAudioStream::get_markers()
+{
+       IndexState *index_state = ffmpeg->file_base->asset->index_state;
+       if( !index_state || idx >= index_state->audio_markers.size() ) return 0;
+       return index_state->audio_markers[idx];
+}
+
 FFVideoStream::FFVideoStream(FFMPEG *ffmpeg, AVStream *strm, int idx, int fidx)
  : FFStream(ffmpeg, strm, fidx)
 {
@@ -831,6 +838,9 @@ AVPixelFormat FFVideoConvert::color_model_to_pix_fmt(int color_model)
        case BC_RGBA8888:       return AV_PIX_FMT_RGBA;
        case BC_BGR8888:        return AV_PIX_FMT_BGR0;
        case BC_BGR888:         return AV_PIX_FMT_BGR24;
+       case BC_ARGB8888:       return AV_PIX_FMT_ARGB;
+       case BC_ABGR8888:       return AV_PIX_FMT_ABGR;
+       case BC_RGB8:           return AV_PIX_FMT_RGB8;
        case BC_YUV420P:        return AV_PIX_FMT_YUV420P;
        case BC_YUV422P:        return AV_PIX_FMT_YUV422P;
        case BC_YUV444P:        return AV_PIX_FMT_YUV444P;
@@ -852,6 +862,9 @@ int FFVideoConvert::pix_fmt_to_color_model(AVPixelFormat pix_fmt)
        case AV_PIX_FMT_RGBA:           return BC_RGBA8888;
        case AV_PIX_FMT_BGR0:           return BC_BGR8888;
        case AV_PIX_FMT_BGR24:          return BC_BGR888;
+       case AV_PIX_FMT_ARGB:           return BC_ARGB8888;
+       case AV_PIX_FMT_ABGR:           return BC_ABGR8888;
+       case AV_PIX_FMT_RGB8:           return BC_RGB8;
        case AV_PIX_FMT_YUV420P:        return BC_YUV420P;
        case AV_PIX_FMT_YUV422P:        return BC_YUV422P;
        case AV_PIX_FMT_YUV444P:        return BC_YUV444P;
@@ -1035,10 +1048,17 @@ int FFVideoConvert::transfer_pixfmt(VFrame *frame,
 void FFVideoStream::load_markers()
 {
        IndexState *index_state = ffmpeg->file_base->asset->index_state;
-       if( idx >= index_state->video_markers.size() ) return;
+       if( !index_state || idx >= index_state->video_markers.size() ) return;
        FFStream::load_markers(*index_state->video_markers[idx], frame_rate);
 }
 
+IndexMarks *FFVideoStream::get_markers()
+{
+       IndexState *index_state = ffmpeg->file_base->asset->index_state;
+       if( !index_state || idx >= index_state->video_markers.size() ) return 0;
+       return !index_state ? 0 : index_state->video_markers[idx];
+}
+
 
 FFMPEG::FFMPEG(FileBase *file_base)
 {
@@ -1134,13 +1154,15 @@ AVRational FFMPEG::to_time_base(int sample_rate)
 
 void FFMPEG::set_option_path(char *path, const char *fmt, ...)
 {
-       get_exe_path(path);
-       strcat(path, "/ffmpeg/");
+       char *ep = path + BCTEXTLEN-1;
+       strncpy(path, File::get_cindat_path(), ep-path);
+       strncat(path, "/ffmpeg/", ep-path);
        path += strlen(path);
        va_list ap;
        va_start(ap, fmt);
-       vsprintf(path, fmt, ap);
+       path += vsnprintf(path, ep-path, fmt, ap);
        va_end(ap);
+       *path = 0;
 }
 
 void FFMPEG::get_option_path(char *path, const char *type, const char *spec)
@@ -2556,7 +2578,6 @@ printf("audio%d pad %ld %ld (%ld)\n", aud->idx, pos, aud->curr_pos, pos-aud->cur
 
 void FFStream::load_markers(IndexMarks &marks, double rate)
 {
-       index_markers = &marks;
        int in = 0;
        int64_t sz = marks.size();
        int max_entries = fmt_ctx->max_index_size / sizeof(AVIndexEntry) - 1;