opengl colorspace + BT2020
[goodguy/history.git] / cinelerra-5.1 / guicast / vframe.C
index 2573e56b334af163db07d684965901fbf49c3248..e8dad7ea1315ee913bb439c355767f4de725dc1b 100644 (file)
@@ -131,14 +131,18 @@ 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);
+       copy_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 +503,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 +841,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;
        }
@@ -1021,14 +1028,12 @@ void VFrame::rotate270()
 
 void VFrame::flip_vert()
 {
-       unsigned char *temp = new unsigned char[bytes_per_line];
-       for(int i = 0, j = h - 1; i < j; i++, j--)
-       {
+       unsigned char temp[bytes_per_line];
+       for( int i=0, j=h; --j>i; ++i ) {
                memcpy(temp, rows[j], bytes_per_line);
                memcpy(rows[j], rows[i], bytes_per_line);
                memcpy(rows[i], temp, bytes_per_line);
        }
-       delete [] temp;
 }
 
 void VFrame::flip_horiz()
@@ -1112,18 +1117,19 @@ int VFrame::copy_from(VFrame *frame)
                        break;
        }
 
-       params->copy_from(frame->params);
        return 0;
 }
 
 int VFrame::transfer_from(VFrame *that, int bg_color, int in_x, int in_y, int in_w, int in_h)
 {
+       timestamp = that->timestamp;
+       copy_params(that);
+
        if( this->get_color_model() == that->get_color_model() &&
            this->get_w() == that->get_w() && this->get_h() == that->get_h() &&
            this->get_bytes_per_line() == that->get_bytes_per_line() )
                return this->copy_from(that);
 
-       timestamp = that->timestamp;
 #if 0
        BC_CModels::transfer(
                this->get_rows(), that->get_rows(),          // Packed data out/in
@@ -1164,7 +1170,6 @@ int VFrame::transfer_from(VFrame *that, int bg_color, int in_x, int in_y, int in
                        that->get_bytes_per_line(),
                bg_color);
 #endif
-       params->copy_from(that->params);
        return 0;
 }
 
@@ -1263,22 +1268,20 @@ void VFrame::copy_stacks(VFrame *src)
 {
        clear_stacks();
 
-       for(int i = 0; i < src->next_effects.total; i++)
-       {
-               char *ptr;
-               next_effects.append(ptr = new char[strlen(src->next_effects.values[i]) + 1]);
-               strcpy(ptr, src->next_effects.values[i]);
-       }
-       for(int i = 0; i < src->prev_effects.total; i++)
-       {
-               char *ptr;
-               prev_effects.append(ptr = new char[strlen(src->prev_effects.values[i]) + 1]);
-               strcpy(ptr, src->prev_effects.values[i]);
-       }
+       for( int i=0; i < src->next_effects.total; ++i )
+               next_effects.append(cstrdup(src->next_effects[i]));
+       for( int i=0; i < src->prev_effects.total; ++i )
+               prev_effects.append(cstrdup(src->prev_effects[i]));
 
        copy_params(src);
 }
 
+int VFrame::copy_vframe(VFrame *frame)
+{
+       copy_stacks(frame);
+       return copy_from(frame);
+}
+
 int VFrame::equal_stacks(VFrame *src)
 {
        for(int i = 0; i < src->next_effects.total && i < next_effects.total; i++)
@@ -1331,7 +1334,7 @@ void VFrame::set_pixel_color(int rgb)
        int ir = 0xff & (pixel_rgb >> 16);
        int ig = 0xff & (pixel_rgb >> 8);
        int ib = 0xff & (pixel_rgb >> 0);
-       bc_rgb2yuv(ir,ig,ib, ir,ig,ib);
+       YUV::yuv.rgb_to_yuv_8(ir, ig, ib);
        pixel_yuv =  (ir<<16) | (ig<<8) | (ib<<0);
 }