Resolved:
Using a Continuously allocated buffer was the correct way to do it, however I was passing to the function a virtual pointer created for the application, whereas it required a physical pointer.
I cannot post the full code here, however in order to allocate physical memory in the IPU, you need to:
Do this Twice to obtain a virtualAddr and physAddr for Source and Destination
int* virtualAddr;
int bufferSize = width*height*bytesperpixel;
int physAddr = bufferSize;
int ipuHandle = open("/dev/mxc_ipu", O_RDWR, 0);
ioctl(ipuHandle, IPU_ALLOC, physAddr); //the ioctl function for some reason requires the size of the buffer that it changes to the physical address in memory.
virtualAddr = (int*)mmap(0, bufferSize, PROT_READ | PROT_WRITE, MAP_SHARED, ipuHandle, physAddr);
Then
void* handle;
g2d_open(&handle);
src.planes[0] = physAddrSource;
src.left = 0;
src.top = 0;
src.right = width;
src.bottom = height;
src.stride = width*2;
src.width = width;
src.height = height;
src.rot = G2D_ROTATION_0;
src.format = G2D_RGBA8888;
dst.planes[0] = physAddrDest;
dst.left = 0;
dst.top = 0;
dst.right = width;
dst.bottom = height;
dst.stride = width;
dst.width = width;
dst.height = height;
dst.rot = G2D_ROTATION_0;
dst.format = G2D_RGBA8888;
error =g2d_blit(handle, &src, &dst);
error =g2d_finish(handle);
error =g2d_close(handle);
ExportBmp(virtualAddrDest, width, height);