1
/***************************************************************************
2
Separate Fields.cpp - description
4
Convert a x*y * f fps video into -> x*(y/2)*fps/2 video
6
Same idea as for avisynth separatefield
9
begin : Thu Mar 21 2002
10
copyright : (C) 2002 by mean
11
email : fixounet@free.fr
12
***************************************************************************/
14
/***************************************************************************
16
* This program is free software; you can redistribute it and/or modify *
17
* it under the terms of the GNU General Public License as published by *
18
* the Free Software Foundation; either version 2 of the License, or *
19
* (at your option) any later version. *
21
***************************************************************************/
26
#include <ADM_assert.h>
35
#include "ADM_toolkit/toolkit.hxx"
36
#include "ADM_editor/ADM_edit.hxx"
37
#include "ADM_video/ADM_genvideo.hxx"
38
#include "ADM_video/ADM_vidFieldUtil.h"
39
#include "ADM_vidSeparateField.h"
40
#include "ADM_filter/video_filters.h"
43
static FILTER_PARAM swapParam={0,{""}};
45
SCRIPT_CREATE(separatefield_script,AVDMVideoSeparateField,swapParam);
46
SCRIPT_CREATE(mergefield_script,AVDMVideoMergeField,swapParam);
47
SCRIPT_CREATE(stackfield_script,AVDMVideoStackField,swapParam);
48
SCRIPT_CREATE(unstackfield_script,AVDMVideoUnStackField,swapParam);
50
BUILD_CREATE(separatefield_create,AVDMVideoSeparateField);
51
BUILD_CREATE(mergefield_create,AVDMVideoMergeField);
52
BUILD_CREATE(stackfield_create,AVDMVideoStackField);
53
BUILD_CREATE(unstackfield_create,AVDMVideoUnStackField);
55
char *AVDMVideoSeparateField::printConf( void )
59
sprintf((char *)buf," Separate Fields");
63
//_______________________________________________________________
64
AVDMVideoSeparateField::AVDMVideoSeparateField(
65
AVDMGenericVideoStream *in,CONFcouple *setup)
69
memcpy(&_info,_in->getInfo(),sizeof(_info));
75
vidCache=new VideoCache(2,_in);
79
// ___ destructor_____________
80
AVDMVideoSeparateField::~AVDMVideoSeparateField()
88
// Basically ask a uncompressed frame from editor and ask
89
// GUI to decompress it .
92
uint8_t AVDMVideoSeparateField::getFrameNumberNoAlloc(uint32_t frame,
99
if(frame>=_info.nb_frames) return 0;
102
ptr=vidCache->getImage(ref);
105
ADM_assert(ptr->data);
106
ADM_assert(data->data);
107
if(frame&1) // odd image
108
vidFieldKeepOdd(_info.width,_info.height,ptr->data,data->data);
110
vidFieldKeepEven(_info.width,_info.height,ptr->data,data->data);
112
vidCache->unlockAll();
115
//------------------ and merge them ------------------
118
char *AVDMVideoMergeField::printConf( void )
122
sprintf((char *)buf," Merge fields");
126
//_______________________________________________________________
127
AVDMVideoMergeField::AVDMVideoMergeField(
128
AVDMGenericVideoStream *in,CONFcouple *setup)
132
memcpy(&_info,_in->getInfo(),sizeof(_info));
133
vidCache=new VideoCache(4,_in);
143
// ___ destructor_____________
144
AVDMVideoMergeField::~AVDMVideoMergeField()
151
Interleave frame*2 and frame*2+1
153
uint8_t AVDMVideoMergeField::getFrameNumberNoAlloc(uint32_t frame,
159
ADMImage *ptr1,*ptr2;
160
if(frame>=_info.nb_frames) return 0;
164
ptr1=vidCache->getImage(ref);
165
ptr2=vidCache->getImage(ref+1);
169
printf("Merge field : cannot read\n");
170
vidCache->unlockAll();
173
vidFieldMerge(_info.width,_info.height,ptr1->data,ptr2->data,data->data);
174
vidCache->unlockAll();
178
//_______________________Stack Fields_______________________
180
char *AVDMVideoStackField::printConf( void )
184
sprintf((char *)buf," Stack fields");
188
//_______________________________________________________________
189
AVDMVideoStackField::AVDMVideoStackField( AVDMGenericVideoStream *in,CONFcouple *setup)
193
memcpy(&_info,_in->getInfo(),sizeof(_info));
194
_uncompressed=new ADMImage(_info.width,_info.height);
198
// ___ destructor_____________
199
AVDMVideoStackField::AVDMVideoStackField()
201
delete _uncompressed;
206
Interleave frame*2 and frame*2+1
208
uint8_t AVDMVideoStackField::getFrameNumberNoAlloc(uint32_t frame,
214
ADMImage *ptr1,*ptr2;
215
if(frame>=_info.nb_frames) return 0;
217
if(!_in->getFrameNumberNoAlloc(frame, len, _uncompressed, flags)) return 0;
219
vidFielStack(_info.width ,_info.height,YPLANE(_uncompressed),YPLANE(data));
220
data->copyInfo(_uncompressed);
225
//_______________________Stack Fields_______________________
227
char *AVDMVideoUnStackField::printConf( void )
231
sprintf((char *)buf," UnStack fields");
235
//_______________________________________________________________
236
AVDMVideoUnStackField::AVDMVideoUnStackField( AVDMGenericVideoStream *in,CONFcouple *setup)
240
memcpy(&_info,_in->getInfo(),sizeof(_info));
241
_uncompressed=new ADMImage(_info.width,_info.height);
245
// ___ destructor_____________
246
AVDMVideoUnStackField::AVDMVideoUnStackField()
248
delete _uncompressed;
253
Interleave frame*2 and frame*2+1
255
uint8_t AVDMVideoUnStackField::getFrameNumberNoAlloc(uint32_t frame,
261
ADMImage *ptr1,*ptr2;
262
if(frame>=_info.nb_frames) return 0;
264
if(!_in->getFrameNumberNoAlloc(frame, len, _uncompressed, flags)) return 0;
266
vidFielUnStack(_info.width ,_info.height,YPLANE(_uncompressed),YPLANE(data));
267
data->copyInfo(_uncompressed);