/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdio.h>
#include "vp9/common/vp9_blockd.h"

void vp9_print_modes_and_motion_vectors(MODE_INFO *mi, int rows, int cols,
                                        int frame) {
  int mb_row;
  int mb_col;
  int mb_index = 0;
  FILE *mvs = fopen("mvs.stt", "a");

  /* print out the macroblock Y modes */
  mb_index = 0;
  fprintf(mvs, "Mb Modes for Frame %d\n", frame);

  for (mb_row = 0; mb_row < rows; mb_row++) {
    for (mb_col = 0; mb_col < cols; mb_col++) {

      fprintf(mvs, "%2d ", mi[mb_index].mbmi.mode);

      mb_index++;
    }

    fprintf(mvs, "\n");
    mb_index++;
  }

  fprintf(mvs, "\n");

  mb_index = 0;
  fprintf(mvs, "Mb mv ref for Frame %d\n", frame);

  for (mb_row = 0; mb_row < rows; mb_row++) {
    for (mb_col = 0; mb_col < cols; mb_col++) {

      fprintf(mvs, "%2d ", mi[mb_index].mbmi.ref_frame);

      mb_index++;
    }

    fprintf(mvs, "\n");
    mb_index++;
  }

  fprintf(mvs, "\n");

  /* print out the macroblock UV modes */
  mb_index = 0;
  fprintf(mvs, "UV Modes for Frame %d\n", frame);

  for (mb_row = 0; mb_row < rows; mb_row++) {
    for (mb_col = 0; mb_col < cols; mb_col++) {

      fprintf(mvs, "%2d ", mi[mb_index].mbmi.uv_mode);

      mb_index++;
    }

    mb_index++;
    fprintf(mvs, "\n");
  }

  fprintf(mvs, "\n");

  /* print out the block modes */
  mb_index = 0;
  fprintf(mvs, "Mbs for Frame %d\n", frame);
  {
    int b_row;

    for (b_row = 0; b_row < 4 * rows; b_row++) {
      int b_col;
      int bindex;

      for (b_col = 0; b_col < 4 * cols; b_col++) {
        mb_index = (b_row >> 2) * (cols + 1) + (b_col >> 2);
        bindex = (b_row & 3) * 4 + (b_col & 3);

        if (mi[mb_index].mbmi.mode == B_PRED) {
          fprintf(mvs, "%2d ", mi[mb_index].bmi[bindex].as_mode.first);
#if CONFIG_COMP_INTRA_PRED
          fprintf(mvs, "%2d ", mi[mb_index].bmi[bindex].as_mode.second);
#endif
        } else
          fprintf(mvs, "xx ");

      }

      fprintf(mvs, "\n");
    }
  }
  fprintf(mvs, "\n");

  /* print out the macroblock mvs */
  mb_index = 0;
  fprintf(mvs, "MVs for Frame %d\n", frame);

  for (mb_row = 0; mb_row < rows; mb_row++) {
    for (mb_col = 0; mb_col < cols; mb_col++) {
      fprintf(mvs, "%5d:%-5d", mi[mb_index].mbmi.mv[0].as_mv.row / 2,
          mi[mb_index].mbmi.mv[0].as_mv.col / 2);

      mb_index++;
    }

    mb_index++;
    fprintf(mvs, "\n");
  }

  fprintf(mvs, "\n");

  /* print out the block modes */
  mb_index = 0;
  fprintf(mvs, "MVs for Frame %d\n", frame);
  {
    int b_row;

    for (b_row = 0; b_row < 4 * rows; b_row++) {
      int b_col;
      int bindex;

      for (b_col = 0; b_col < 4 * cols; b_col++) {
        mb_index = (b_row >> 2) * (cols + 1) + (b_col >> 2);
        bindex = (b_row & 3) * 4 + (b_col & 3);
        fprintf(mvs, "%3d:%-3d ",
                mi[mb_index].bmi[bindex].as_mv.first.as_mv.row,
                mi[mb_index].bmi[bindex].as_mv.first.as_mv.col);

      }

      fprintf(mvs, "\n");
    }
  }
  fprintf(mvs, "\n");

  fclose(mvs);
}
