Guardar marco de TangoService_connectOnFrameAvailable

¿Cómo puedo guardar un marco a través de TangoService_connectOnFrameAvailable () y mostrarlo correctamente en mi computadora? Comoesta página de referencia menciona que los píxeles se almacenan en el formato HAL_PIXEL_FORMAT_YV12. En mi función de devolución de llamada para TangoService_connectOnFrameAvailable, guardo el marco de esta manera:

static void onColorFrameAvailable(void* context, TangoCameraId id, const TangoImageBuffer* buffer) 
{
  ...
  std::ofstream fp;
  fp.open(imagefile, std::ios::out | std::ios::binary );
  int offset = 0;
  for(int i = 0; i < buffer->height*2 + 1; i++) {
    fp.write((char*)(buffer->data + offset), buffer->width);
    offset += buffer->stride;
  }
  fp.close();
}

Luego, para deshacerme de los metadatos en la primera fila y mostrar la imagen que ejecuto:

$ dd if="input.raw" of="new.raw" bs=1 skip=1280
$ vooya new.raw

Tuve cuidado de asegurarme en vooya de que el orden del canal es yvu. El resultado resultante es:

¿Qué estoy haciendo mal al guardar la imagen y mostrarla?

ACTUALIZACIÓN según la respuesta de Mark Mullin:

int offset = buffer->stride; // header offset
// copy Y channel
for(int i = 0; i < buffer->height; i++) {
  fp.write((char*)(buffer->data + offset), buffer->width);
  offset += buffer->stride;
}
// copy V channel
for(int i = 0; i < buffer->height / 2; i++) {
  fp.write((char*)(buffer->data + offset), buffer->width / 2);
  offset += buffer->stride / 2;
}
// copy U channel
for(int i = 0; i < buffer->height / 2; i++) {
  fp.write((char*)(buffer->data + offset), buffer->width / 2);
  offset += buffer->stride / 2;
}

Esto ahora muestra la imagen a continuación, pero todavía hay algunos artefactos; Me pregunto si eso es de la cámara de la tableta Tango o mi procesamiento de los datos en bruto ... ¿alguna idea?

Respuestas a la pregunta(2)

Su respuesta a la pregunta