/**
 * @brief Movie Player Sample GVDインタフェース
 * @file mps_gvdinterface.c
 * @author AXELL
 * @history 17_02_22  初版
 * @history 2017_10_26  Ver2.0
 * @note エラーコードはAG903_error.hを参照のこと.
 */

/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017 AXELL CORPORATION, all rights reserved.
 */

#include "mps/mps_gvdinterface.h"

/**
 * MP4コンテナから得られる情報をmpsMovieInfo構造体で返す<p>
 * GVDから呼び出され、消費メモリの推定などに使用する
 * @brief 動画コンテナ情報を取得
 * @param id [in]ストリームID
 * @param info [out]コンテナ情報の保存先
 * @return エラーコード
 */
int32_t MPS_GetMovieInfo(uint32_t id, mpsMovieInfo *info)
{
	mpsContext *ctx = MPS_getContext(id);
	gvdInitializeParam *GVDParam = MPS_getGVDInitParam();

	if(id > GVDParam->stream_num)
	    return -AG903_EINVAL;
	if(info == NULL)
	    return -AG903_EINVAL;

	info->profile		 = ctx->info.profile;
	info->level			 = ctx->info.level;
	info->total_frame	 = ctx->info.total_frame;
	info->height		 = ctx->info.height;
	info->width			 = ctx->info.width;
	info->stream_size	 = ctx->info.stream_size;
	info->time_scale	 = ctx->info.time_scale;
	info->duration		 = ctx->info.duration;
	info->frame_length	 = ctx->info.frame_length;
	info->max_ref_frames = ctx->info.max_ref_frames;
	info->keyframe_count = ctx->info.keyframe_count;
	info->keyframe		 = ctx->info.keyframe;

	return AG903_ENONE;
}

/**
 * MP4コンテナの情報を基に、指定フレームのオフセットを返す<p>
 * 問題がある場合は0を返すことでエラーとする<p>
 * （MP4ファイルの映像がオフセット'0'になることは無い）
 * @brief フレーム番号からファイルのオフセットを取得
 * @param id [in]ストリームID
 * @param frame_id [in]フレーム番号
 * @param idr_frame_id [out] IDRフレーム番号
 * @return ファイル先頭からのオフセット
 * @return 0:エラー（フレーム番号が総フレーム数より多い場合）
 * @note frame_id, idr_frame_idは0起算です
 */
uint32_t MPS_GetSeekPositionFromFrameID(uint32_t id, uint32_t frame_id, uint32_t *idr_frame_id)
{
	uint32_t idr, pos;
	mpsContext *ctx = MPS_getContext(id);
	if(ctx->info.profile == 0)
		return 0;
	/* MPS内はフレーム1起算 */
	MPS_GetNearIDRPos(id, frame_id+1, &idr, &pos);
	if(idr_frame_id != NULL)
		*idr_frame_id = idr-1;
	return pos;
}


/**
 * MP4コンテナの情報を基に、指定時間に該当するフレームのオフセットを返す<p>
 * 問題がある場合は0を返すことでエラーとする<p>
 * （MP4ファイルの映像がオフセット'0'になることは無い）
 * @brief 時間からファイルのオフセットを取得
 * @param id [in]ストリームID
 * @param time_ms [in]時間（ミリ秒単位）
 * @param idr_frame_id [out] IDRフレーム番号
 * @return ファイル先頭からのオフセット
 * @return 0:エラー（指定時間が再生時間より長い場合）
 * @note idr_frame_idは0起算です
 */
uint32_t MPS_GetSeekPositionFromTime(uint32_t id, uint32_t time_ms, uint32_t *idr_frame_id)
{
	mpsContext *ctx = MPS_getContext(id);
	uint32_t frame;
	mpsMovieInfo *info = &ctx->info;
	frame = (time_ms*1000) / (info->frame_length*1000000/info->time_scale);
	/* フレームIDを算出 */
	return MPS_GetSeekPositionFromFrameID(id, frame, idr_frame_id);
}
