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; }
int RecVideoOverlay:: overlay(VFrame *out) { VFrame *in = vframe; int xx = x * scale, yy = y * scale; int w = in->get_w(), h = in->get_h(); int ww = w * scale, hh = h * scale; BC_WindowBase::get_cmodels()->transfer(out->get_rows(), in->get_rows(), out->get_y(), out->get_u(), out->get_v(), in->get_y(), in->get_u(), in->get_v(), 0, 0, w, h, xx, yy, ww, hh, in->get_color_model(), out->get_color_model(), 0, in->get_bytes_per_line(), out->get_bytes_per_line()); return ticks > 0 && --ticks == 0 ? 1 : 0; }
int FileYUV::read_frame(VFrame *frame) { int result; VFrame *input = frame; // short cut for direct copy routines if (frame->get_color_model() == BC_COMPRESSED) { long frame_size = (long) // w*h + w*h/4 + w*h/4 (stream->get_height() * stream->get_width() * 1.5); frame->allocate_compressed_data(frame_size); frame->set_compressed_size(frame_size); return stream->read_frame_raw(frame->get_data(), frame_size); } // process through a temp frame if necessary if (! cmodel_is_planar(frame->get_color_model()) || (frame->get_w() != stream->get_width()) || (frame->get_h() != stream->get_height())) { ensure_temp(stream->get_width(), stream->get_height()); input = temp; } uint8_t *yuv[3]; yuv[0] = input->get_y(); yuv[1] = input->get_u(); yuv[2] = input->get_v(); result = stream->read_frame(yuv); if (result) return result; // transfer from the temp frame to the real one if (input != frame) { FFMPEG::convert_cmodel(input, frame); } return 0; }
int FileYUV::write_frames(VFrame ***layers, int len) { int result; // only one layer supported VFrame **frames = layers[0]; VFrame *frame; for (int n = 0; n < len; n++) { frame = frames[n]; // short cut for direct copy routines if (frame->get_color_model() == BC_COMPRESSED) { long frame_size = frame->get_compressed_size(); if (incoming_asset->format == FILE_YUV) return stream->write_frame_raw(frame->get_data(), frame_size); // decode and write an encoded frame if (FFMPEG::codec_id(incoming_asset->vcodec) != CODEC_ID_NONE) { if (! ffmpeg) { ffmpeg = new FFMPEG(incoming_asset); ffmpeg->init(incoming_asset->vcodec); } ensure_temp(incoming_asset->width, incoming_asset->height); int result = ffmpeg->decode(frame->get_data(), frame_size, temp); // some formats are decoded one frame later if (result == FFMPEG_LATENCY) { // remember to write the last frame pipe_latency++; return 0; } if (result) { delete ffmpeg; ffmpeg = 0; return 1; } uint8_t *yuv[3]; yuv[0] = temp->get_y(); yuv[1] = temp->get_u(); yuv[2] = temp->get_v(); return stream->write_frame(yuv); } } // process through a temp frame only if necessary if (! cmodel_is_planar(frame->get_color_model()) || (frame->get_w() != stream->get_width()) || (frame->get_h() != stream->get_height())) { ensure_temp(asset->width, asset->height); FFMPEG::convert_cmodel(frame, temp); frame = temp; } uint8_t *yuv[3]; yuv[0] = frame->get_y(); yuv[1] = frame->get_u(); yuv[2] = frame->get_v(); result = stream->write_frame(yuv); if (result) return result; } return 0; }