X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fvframe.C;h=eaa1f078cb826c063f27880296de0b507d4dfb90;hb=243336668c89096732786c6b3f3c5918aa2eff26;hp=2573e56b334af163db07d684965901fbf49c3248;hpb=9d832a1fff11b11aaa1108c460690ed05e2bdc05;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/vframe.C b/cinelerra-5.1/guicast/vframe.C index 2573e56b..eaa1f078 100644 --- a/cinelerra-5.1/guicast/vframe.C +++ b/cinelerra-5.1/guicast/vframe.C @@ -131,6 +131,7 @@ VFrame::VFrame(VFrame &frame) { reset_parameters(1); params = new BC_Hash; + use_shm = frame.use_shm; allocate_data(0, -1, 0, 0, 0, frame.w, frame.h, frame.color_model, frame.bytes_per_line); copy_from(&frame); @@ -139,6 +140,8 @@ VFrame::VFrame(VFrame &frame) VFrame::VFrame(int w, int h, int color_model, long bytes_per_line) { reset_parameters(1); +// use bytes_per_line == 0 to allocate default unshared + if( !bytes_per_line ) { bytes_per_line = -1; use_shm = 0; } params = new BC_Hash; allocate_data(data, -1, 0, 0, 0, w, h, color_model, bytes_per_line); @@ -499,27 +502,30 @@ int VFrame::allocate_data(unsigned char *data, int shmid, } else { memory_type = VFrame::PRIVATE; + this->data = 0; int size = calculate_data_size(this->w, this->h, this->bytes_per_line, this->color_model); - if(BC_WindowBase::get_resources()->use_vframe_shm() && use_shm) { + if( use_shm && size >= SHM_MIN_SIZE && + BC_WindowBase::get_resources()->use_vframe_shm() ) { this->shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | 0777); - if(this->shmid < 0) { - printf("VFrame::allocate_data %d could not allocate shared memory\n", __LINE__); - } - - this->data = (unsigned char*)shmat(this->shmid, NULL, 0); -//printf("VFrame::allocate_data %d %d %d\n", __LINE__, size, this->shmid); - -//printf("VFrame::allocate_data %d %p\n", __LINE__, this->data); + if( this->shmid >= 0 ) { + this->data = (unsigned char*)shmat(this->shmid, NULL, 0); +//printf("VFrame::allocate_data %d %d %d %p\n", __LINE__, size, this->shmid, this->data); // This causes it to automatically delete when the program exits. - shmctl(this->shmid, IPC_RMID, 0); + shmctl(this->shmid, IPC_RMID, 0); + } + else { + printf("VFrame::allocate_data %d could not allocate" + " shared memory, %dx%d (model %d) size=0x%08x\n", + __LINE__, w, h, color_model, size); + BC_Trace::dump_shm_stats(stdout); + } } - else { // Have to use malloc for libpng -//printf("==vframe %d from %p\n", size, __builtin_return_address(0)); + if( !this->data ) { this->data = (unsigned char *)malloc(size); + this->shmid = -1; } - // Memory check // if(this->w * this->h > 1500 * 1100) // printf("VFrame::allocate_data 2 this=%p w=%d h=%d this->data=%p\n", @@ -834,7 +840,7 @@ int VFrame::write_png(const char *path) bc_cmodel = BC_RGBA8888; png_cmodel = PNG_COLOR_TYPE_RGB_ALPHA; } - vframe = new VFrame(get_w(), get_h(), bc_cmodel, -1); + vframe = new VFrame(get_w(), get_h(), bc_cmodel, 0); vframe->transfer_from(this); break; }