Click here to Skip to main content
15,898,035 members
Articles / Multimedia / Video

Dynamic Cropping for VirtualDub

Rate me:
Please Sign up or sign in to vote.
4.73/5 (9 votes)
14 Aug 2011GPL36 min read 56.7K   1.6K   20  
This article describes a project that enables the VirtualDub software with a new dynamic cropping feature.
//	VirtualDub - Video processing and capture application
//	Copyright (C) 1998-2001 Avery Lee
//
//	This program is free software; you can redistribute it and/or modify
//	it under the terms of the GNU General Public License as published by
//	the Free Software Foundation; either version 2 of the License, or
//	(at your option) any later version.
//
//	This program is distributed in the hope that it will be useful,
//	but WITHOUT ANY WARRANTY; without even the implied warranty of
//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//	GNU General Public License for more details.
//
//	You should have received a copy of the GNU General Public License
//	along with this program; if not, write to the Free Software
//	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#ifndef f_CLIPPINGCONTROL_H
#define f_CLIPPINGCONTROL_H

#include <windows.h>

#include <vd2/system/vectors.h>

struct VDPixmap;
class VFBitmapInternal;

#define CLIPPINGCONTROLCLASS (szClippingControlName)

#ifndef f_CLIPPINGCONTROL_CPP
extern const char szClippingControlName[];
#endif

#define CCS_POSITION			(0x00000001L)
#define CCS_FRAME				(0x00000002L)

#define CCN_REFRESHFRAME		(NM_FIRST+32)

#define CCM__FIRST				(WM_USER+0x100)
#define CCM__LAST				(WM_USER+0x120)
#define CCM_SETBITMAPSIZE		(WM_USER+0x120)
#define CCM_SETCLIPBOUNDS		(WM_USER+0x121)
#define CCM_GETCLIPBOUNDS		(WM_USER+0x122)
#define CCM_BLITFRAME2			(WM_USER+0x124)

class VDINTERFACE IVDDynClippingStorage : public vdrefcounted<IVDRefCount> {
public:
	// Initialize clipping map
	virtual void Init(int sourceW, int sourceH) = 0;
	// Get source width
	virtual int GetWidth() = 0;
	// Get source height
	virtual int GetHeight() = 0;
	// Load clipping map from a file
	virtual VDStringW Load(wchar_t *filename, HWND parent) = 0;
	// Save clipping map to a file
	virtual VDStringW Dump(wchar_t *filename, HWND parent) = 0;
	// Display configuration interface
	virtual void Configure(HWND parent) = 0;
	// Set clipping bounds for position
	virtual int SetClipBounds(sint64 pos, const vdrect32& r) = 0;
	// Get clipping bounds for position
	virtual int GetClipBounds(sint64 pos, vdrect32& r) = 0;
	// Get position for clipping map index
	virtual sint64 GetClipPos(int idx) = 0;
	// Get clipping map size
	virtual int GetTotalClipPos() = 0;
	// Get the resulted crop size
	virtual void GetCrop(vdrect32& r) = 0;
	// Delete clipping map entry by index
	virtual void DelClipBounds(int idx) = 0;
	// Crop pixmap for given position
	virtual bool DoCrop(VDPixmap& dst, sint64 pos, vdrect32& crop_area) = 0;
	// Add/drop range to/from clipping map
	virtual void ChangeTimeline(sint64 pos, sint64 nframes, bool add) = 0;
};

class VDINTERFACE IVDClippingControl {
public:
	virtual void SetBitmapSize(int sourceW, int sourceH) = 0;
	virtual void SetClipBounds(const vdrect32& r) = 0;
	virtual void GetClipBounds(vdrect32& r) = 0;
	virtual void SetClippingStorage(IVDDynClippingStorage *dcs) = 0;
	virtual IVDDynClippingStorage *GetClippingStorage() = 0;
	virtual void AutoSize(int borderW, int borderH);
	virtual void BlitFrame(const VDPixmap *px) = 0;
	virtual bool GetLockAspectRatio() = 0;
	virtual void SetLockAspectRatio(bool lock) = 0;

};

struct ClippingControlBounds {
	sint32 x1, y1, x2, y2;
};

ATOM RegisterClippingControl();

class IVDPositionControl;

IVDClippingControl *VDGetIClippingControl(VDGUIHandle h);
IVDPositionControl *VDGetIPositionControlFromClippingControl(VDGUIHandle h);
IVDDynClippingStorage *VDGetDynClippingStorage();

#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Software Developer (Senior)
Canada Canada
I am a Software Engineer with 20+ years of experience in different fields of programming. Presently I live in the Toronto area.

Comments and Discussions