projects
/
goodguy
/
history.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vicon drag tweaks, proxy drag fix, vicon mouseover, binfolder around sort fix, draw_r...
[goodguy/history.git]
/
cinelerra-5.1
/
guicast
/
vframe.C
diff --git
a/cinelerra-5.1/guicast/vframe.C
b/cinelerra-5.1/guicast/vframe.C
index 2573e56b334af163db07d684965901fbf49c3248..041887702435f4028f605bf07ebdfbb1720fb610 100644
(file)
--- a/
cinelerra-5.1/guicast/vframe.C
+++ b/
cinelerra-5.1/guicast/vframe.C
@@
-131,14
+131,18
@@
VFrame::VFrame(VFrame &frame)
{
reset_parameters(1);
params = new BC_Hash;
{
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);
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);
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);
params = new BC_Hash;
allocate_data(data, -1, 0, 0, 0, w, h,
color_model, bytes_per_line);
@@
-276,7
+280,8
@@
int VFrame::reset_parameters(int do_opengl)
timestamp = -1.;
is_keyframe = 0;
draw_point = 0;
timestamp = -1.;
is_keyframe = 0;
draw_point = 0;
- set_pixel_color(BLACK);
+ pixel_rgb = 0x000000; // BLACK
+ pixel_yuv = 0x008080;
stipple = 0;
if(do_opengl)
stipple = 0;
if(do_opengl)
@@
-350,6
+355,7
@@
if( memory_type != VFrame::SHARED )
case BC_YUV444P:
case BC_RGB_FLOATP:
case BC_RGBA_FLOATP:
case BC_YUV444P:
case BC_RGB_FLOATP:
case BC_RGBA_FLOATP:
+ case BC_GBRP:
break;
default:
break;
default:
@@
-441,6
+447,12
@@
void VFrame::create_row_pointers()
this->u_offset = sz;
this->v_offset = sz + sz;
break;
this->u_offset = sz;
this->v_offset = sz + sz;
break;
+ case BC_GBRP:
+ if( this->v_offset ) break;
+ this->y_offset = 0;
+ this->u_offset = sz * sizeof(uint8_t);
+ this->v_offset = 2 * sz * sizeof(uint8_t);
+ break;
case BC_RGBA_FLOATP:
if( this->v_offset || a ) break;
a = this->data + 3 * sz * sizeof(float);
case BC_RGBA_FLOATP:
if( this->v_offset || a ) break;
a = this->data + 3 * sz * sizeof(float);
@@
-499,27
+511,30
@@
int VFrame::allocate_data(unsigned char *data, int shmid,
}
else {
memory_type = VFrame::PRIVATE;
}
else {
memory_type = VFrame::PRIVATE;
+ this->data = 0;
int size = calculate_data_size(this->w, this->h,
this->bytes_per_line, this->color_model);
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);
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.
// 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
// 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->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",
// 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
+849,7
@@
int VFrame::write_png(const char *path)
bc_cmodel = BC_RGBA8888;
png_cmodel = PNG_COLOR_TYPE_RGB_ALPHA;
}
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;
}
vframe->transfer_from(this);
break;
}
@@
-877,27
+892,33
@@
int VFrame::clear_frame()
case BC_YUV410P:
bzero(get_y(), sz);
case BC_YUV410P:
bzero(get_y(), sz);
-
bzero(get_u()
, w / 4 * h / 4);
-
bzero(get_v()
, w / 4 * h / 4);
+
memset(get_u(), 0x80
, w / 4 * h / 4);
+
memset(get_v(), 0x80
, w / 4 * h / 4);
break;
case BC_YUV411P:
case BC_YUV420P:
case BC_YUV420PI:
bzero(get_y(), sz);
break;
case BC_YUV411P:
case BC_YUV420P:
case BC_YUV420PI:
bzero(get_y(), sz);
-
bzero(get_u()
, sz / 4);
-
bzero(get_v()
, sz / 4);
+
memset(get_u(), 0x80
, sz / 4);
+
memset(get_v(), 0x80
, sz / 4);
break;
case BC_YUV422P:
bzero(get_y(), sz);
break;
case BC_YUV422P:
bzero(get_y(), sz);
- bzero(get_u(), sz / 2);
- bzero(get_v(), sz / 2);
+ memset(get_u(), 0x80, sz / 2);
+ memset(get_v(), 0x80, sz / 2);
+ break;
+
+ case BC_GBRP:
+ bzero(get_y(), sz);
+ bzero(get_u(), sz);
+ bzero(get_b(), sz);
break;
case BC_RGBA_FLOATP: if( a ) {
float *ap = (float *)a;
break;
case BC_RGBA_FLOATP: if( a ) {
float *ap = (float *)a;
- for( int i=sz; --i>=0; ++ap ) *ap =
1
.f; }
+ for( int i=sz; --i>=0; ++ap ) *ap =
0
.f; }
case BC_RGB_FLOATP: {
float *rp = (float *)y;
for( int i=sz; --i>=0; ++rp ) *rp = 0.f;
case BC_RGB_FLOATP: {
float *rp = (float *)y;
for( int i=sz; --i>=0; ++rp ) *rp = 0.f;
@@
-908,8
+929,8
@@
int VFrame::clear_frame()
break; }
case BC_YUV444P:
bzero(get_y(), sz);
break; }
case BC_YUV444P:
bzero(get_y(), sz);
-
bzero(get_u()
, sz);
-
bzero(get_v()
, sz);
+
memset(get_u(), 0x80
, sz);
+
memset(get_v(), 0x80
, sz);
break;
case BC_YUV888:
break;
case BC_YUV888:
@@
-1021,14
+1042,12
@@
void VFrame::rotate270()
void VFrame::flip_vert()
{
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);
}
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()
}
void VFrame::flip_horiz()
@@
-1112,18
+1131,19
@@
int VFrame::copy_from(VFrame *frame)
break;
}
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)
{
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);
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
#if 0
BC_CModels::transfer(
this->get_rows(), that->get_rows(), // Packed data out/in
@@
-1164,7
+1184,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
that->get_bytes_per_line(),
bg_color);
#endif
- params->copy_from(that->params);
return 0;
}
return 0;
}
@@
-1263,22
+1282,20
@@
void VFrame::copy_stacks(VFrame *src)
{
clear_stacks();
{
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);
}
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++)
int VFrame::equal_stacks(VFrame *src)
{
for(int i = 0; i < src->next_effects.total && i < next_effects.total; i++)
@@
-1331,7
+1348,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);
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);
}
pixel_yuv = (ir<<16) | (ig<<8) | (ib<<0);
}