X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffiledb.C;fp=cinelerra-5.1%2Fcinelerra%2Ffiledb.C;h=b8c2062e37bb04e8ecc43fd3a24e903832f79e82;hp=0000000000000000000000000000000000000000;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b diff --git a/cinelerra-5.1/cinelerra/filedb.C b/cinelerra-5.1/cinelerra/filedb.C new file mode 100644 index 00000000..b8c2062e --- /dev/null +++ b/cinelerra-5.1/cinelerra/filedb.C @@ -0,0 +1,186 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "asset.h" +#include "filebase.h" +#include "file.h" +#include "filedb.h" +#include "mediadb.h" +#include "mwindow.h" +#include "preferences.h" +#include "vframe.h" + +#include +#include +#include + + +FileDB::FileDB(Asset *asset, File *file) + : FileBase(asset, file) +{ + reset_parameters(); + mdb = new MediaDb(); + if(asset->format == FILE_UNKNOWN) + asset->format = FILE_DB; + clip_id = -1; + swidth = (SWIDTH+1) & ~1; + sheight = (SHEIGHT+1) & ~1; + frame_id = clip_size = -1; + seq_no = 0; + prefix_size = suffix_offset = -1; + framerate = -1; + vframe = 0; +} + +FileDB::~FileDB() +{ + close_file(); + delete mdb; +} + +int FileDB::check_sig(Asset *asset) +{ + return !strncmp(asset->path,"/db:",4); +} + +int FileDB::open_file(int rd, int wr) +{ + int result = 0; + if( mdb->openDb() ) return 1; + mdb->detachDb(); + + if(rd) { + char *cp = 0; + clip_id = strtol(asset->path+4,&cp,0); + if( !cp || cp == asset->path+4 || *cp != 0 ) result = 1; + if( !result ) result = mdb->clip_id(clip_id); + if( !result ) { + framerate = mdb->clip_framerate(); + clip_size = mdb->clip_size(); + prefix_size = mdb->clip_prefix_size(); + suffix_offset = mdb->clip_frames() - clip_size; + asset->audio_data = 0; + asset->video_data = 1; + asset->actual_width = swidth; + asset->actual_height = sheight; + if( !asset->layers ) asset->layers = 1; + if( !asset->width ) asset->width = asset->actual_width; + if( !asset->height ) asset->height = asset->actual_height; + if( !asset->video_length ) asset->video_length = clip_size; + if( !asset->frame_rate ) asset->frame_rate = framerate; + } + } + + if(!result && wr ) { + result = 1; + } + + if( result ) { + mdb->closeDb(); + } + return result; +} + +int FileDB::close_file() +{ + reset_parameters(); + FileBase::close_file(); + mdb->closeDb(); + delete vframe; + vframe = 0; + return 0; +} + +int FileDB::get_best_colormodel(Asset *asset, int driver) +{ + return BC_YUV420P; +} + +int FileDB::colormodel_supported(int colormodel) +{ + return colormodel; +} + + +int FileDB::set_video_position(int64_t pos) +{ + if( pos < 0 || pos >= asset->video_length ) + return 1; + seq_no = pos; + return 0; +} + +int64_t FileDB::get_memory_usage() +{ + return 0; +} + + + +int FileDB::write_frames(VFrame ***frames, int len) +{ + int result = 0; + return result; +} + + +int FileDB::read_frame(VFrame *frame) +{ + int sw, sh; + mdb->attachDb(); + int result = seq_no < clip_size ? 0 : 1; + if( !result ) { + int n = seq_no++; + if( !n ) { frame_id = -1; } + else if( n >= prefix_size ) n += suffix_offset; + result = mdb->get_sequences(clip_id, n); + if( !result && mdb->timeline_sequence_no() == n ) + frame_id = mdb->timeline_frame_id(); + } + VFrame *fp = frame->get_w() == swidth && frame->get_h() == sheight && + frame->get_color_model() == BC_YUV420P ? frame : + !vframe ? (vframe = new VFrame(swidth,sheight,BC_YUV420P)) : + vframe; + if( !result ) { + if( frame_id < 0 ) + memset(fp->get_y(), 0, swidth*sheight); + else + result = mdb->get_image(frame_id, fp->get_y(), sw,sh); + } +//printf("seq_no=%d, result=%d\n",seq_no,result); + mdb->detachDb(); + if( !result ) { + memset(fp->get_u(),0x80,swidth/2 * sheight/2); + memset(fp->get_v(),0x80,swidth/2 * sheight/2); + } + if( !result && fp == vframe ) { + BC_CModels::transfer(frame->get_rows(), fp->get_rows(), + frame->get_y(), frame->get_u(), frame->get_v(), + fp->get_y(), fp->get_u(), fp->get_v(), + 0, 0, fp->get_w(), fp->get_h(), + 0, 0, frame->get_w(), frame->get_h(), + fp->get_color_model(), frame->get_color_model(), 0, + fp->get_bytes_per_line(), swidth); + } + return result; +} + +