nudge = AV_NOPTS_VALUE;
seek_pos = curr_pos = 0;
seeked = 1; eof = 0;
- index_markers = 0;
reading = writing = 0;
flushed = 0;
need_packet = 1;
// 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);
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)
{
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;
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;
default: break;
}
- return BC_TRANSPARENCY;
+ return -1;
}
int FFVideoConvert::convert_picture_vframe(VFrame *frame,
AVFrame *ip, AVPixelFormat ifmt, int iw, int ih)
{
+ // try bc_xfer methods
+ int imodel = pix_fmt_to_color_model(ifmt);
+ if( imodel >= 0 ) {
+ long y_ofs = 0, u_ofs = 0, v_ofs = 0;
+ uint8_t *data = ip->data[0];
+ if( BC_CModels::is_yuv(imodel) ) {
+ u_ofs = ip->data[1] - data;
+ v_ofs = ip->data[2] - data;
+ }
+ VFrame iframe(data, -1, y_ofs, u_ofs, v_ofs, iw, ih, imodel, ip->linesize[0]);
+ frame->transfer_from(&iframe);
+ return 0;
+ }
+ // try sws methods
AVFrame opic;
int cmodel = frame->get_color_model();
AVPixelFormat ofmt = color_model_to_pix_fmt(cmodel);
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)
{
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)
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;