projects
/
goodguy
/
history.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
yuv colorspace/range + prefs, ffmpeg colorrange probe, x11 direct force colormodel...
[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..eaa1f078cb826c063f27880296de0b507d4dfb90 100644
(file)
--- 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;
{
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);
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);
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);
@@
-499,27
+502,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
+840,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;
}