1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: y2r_Api.h 4 5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 31133 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NN_Y2R_CTR_Y2R_API_H_ 17 #define NN_Y2R_CTR_Y2R_API_H_ 18 19 /*! @file 20 @brief Y2R ( YUV to RGB ) に関する API の宣言 21 */ 22 23 #include <nn/os.h> 24 #include <nn/y2r/CTR/y2r_Types.h> 25 26 #include <nn/y2r/CTR/y2r_Y2r.h> 27 28 namespace nn { 29 namespace y2r { 30 namespace CTR { 31 32 namespace detail 33 { 34 bool InitializeBase(Handle* pSession, const char* name); 35 bool PingProcess(u8* connectedNumber); 36 void FinalizeBase(Handle* pSession); 37 void SetInputFormat( InputFormat format ); 38 InputFormat GetInputFormat( void ); 39 void SetOutputFormat( OutputFormat format ); 40 OutputFormat GetOutputFormat( void ); 41 void SetRotation( Rotation rotation ); 42 Rotation GetRotation( void ); 43 void SetBlockAlignment( BlockAlignment align ); 44 BlockAlignment GetBlockAlignment( void ); 45 void SetSpacialDithering( bool enable ); 46 bool GetSpacialDithering( void ); 47 void SetTemporalDithering( bool enable ); 48 bool GetTemporalDithering( void ); 49 void SetTransferEndInterrupt( bool enable ); 50 bool GetTransferEndInterrupt( void ); 51 void GetTransferEndEvent( nn::os::Event* pEvent ); 52 void SetSendingY( u32 pSrc, size_t imageSize, s16 transferUnit, s16 transferStride ); 53 void SetSendingU( u32 pSrc, size_t imageSize, s16 transferUnit, s16 transferStride ); 54 void SetSendingV( u32 pSrc, size_t imageSize, s16 transferUnit, s16 transferStride ); 55 void SetSendingYuv( u32 pSrc, size_t imageSize, s16 transferUnit, s16 transferStride ); 56 bool IsFinishedSendingYuv( void ); 57 bool IsFinishedSendingY( void ); 58 bool IsFinishedSendingU( void ); 59 bool IsFinishedSendingV( void ); 60 void SetReceiving( u32 pDst, size_t imageSize, s16 transferUnit, s16 transferStride ); 61 bool IsFinishedReceiving( void ); 62 void SetInputLineWidth( s16 width ); 63 s16 GetInputLineWidth( void ); 64 void SetInputLines( s16 lines ); 65 s16 GetInputLines( void ); 66 size_t GetOutputFormatBytes( OutputFormat format ); 67 size_t GetOutputBlockSize( s16 lineWidth, OutputFormat format ); 68 size_t GetOutputImageSize( s16 lineWidth, s16 height, OutputFormat format ); 69 void SetCoefficientParams( CoefficientParams src ); 70 void GetCoefficientParams( CoefficientParams* pDst ); 71 void SetStandardCoefficient( StandardCoefficient no ); 72 void GetStandardCoefficientParams( CoefficientParams* pDst, StandardCoefficient no ); 73 void SetAlpha( s16 alpha ); 74 s16 GetAlpha( void ); 75 void SetDitheringWeightParams( const DitheringWeightParams & w ); 76 void GetDitheringWeightParams( DitheringWeightParams* pW ); 77 nn::Result StartConversion( void ); 78 void StopConversion( void ); 79 bool IsBusyConversion( void ); 80 81 // パラメータ一括設定ユーティリティ関数 82 void SetPackageParameter(const PackageParameter& param); 83 } 84 85 namespace 86 { 87 const char PORT_NAME_USER[] = "y2r:u"; 88 const u16 OUTPUT_BUF_SIZE = 24*1024; // 出力バッファサイズ 89 const u8 OUTPUT_LINES_NUM = 8; // 出力バッファにためておける最大ライン数 90 } 91 92 /*! 93 @brief Y2R ライブラリの初期化を行います。 94 95 @return 成功ならば true, 他のプロセスが使用中のため、失敗した場合は false が返ります。 96 アプリが呼び出す際に false が返ることはありません。 97 */ 98 bool Initialize(); 99 Initialize()100 inline bool Initialize() { return detail::InitializeBase(&detail::Y2r::s_Session, PORT_NAME_USER); } 101 102 /*! 103 @brief Y2R ライブラリを終了します。 104 105 @return なし。 106 */ 107 void Finalize(); 108 Finalize()109 inline void Finalize() { detail::FinalizeBase(&detail::Y2r::s_Session); } 110 111 /*! 112 @brief 入力形式を設定します。 113 114 @param[in] format 入力形式を指定します。 115 @return なし。 116 */ SetInputFormat(InputFormat format)117 inline void SetInputFormat( InputFormat format ) 118 { 119 detail::SetInputFormat(format); 120 } 121 /*! 122 @brief 入力形式を取得します。 123 124 @return 設定されている入力形式が返ります。 125 */ GetInputFormat(void)126 inline InputFormat GetInputFormat( void ) 127 { 128 return detail::GetInputFormat(); 129 } 130 /*! 131 @brief 出力形式を設定します。 132 133 @param[in] format 出力形式を指定します。 134 @return なし。 135 */ SetOutputFormat(OutputFormat format)136 inline void SetOutputFormat( OutputFormat format ) 137 { 138 detail::SetOutputFormat(format); 139 } 140 /*! 141 @brief 出力形式を取得します。 142 143 @return 設定されている出力形式が返ります。 144 */ GetOutputFormat(void)145 inline OutputFormat GetOutputFormat( void ) 146 { 147 return detail::GetOutputFormat(); 148 } 149 /*! 150 @brief 出力バッファの回転角度を設定します。 151 152 @param[in] rotation 角度を指定します。 153 @return なし。 154 */ SetRotation(Rotation rotation)155 inline void SetRotation( Rotation rotation ) 156 { 157 detail::SetRotation(rotation); 158 } 159 /*! 160 @brief 出力バッファの回転角度を取得します。 161 162 @return 設定されている角度が返ります。 163 */ GetRotation(void)164 inline Rotation GetRotation( void ) 165 { 166 return detail::GetRotation(); 167 } 168 /*! 169 @brief 出力バッファのデータの並び方を設定します。 170 171 @param[in] align データの並び方を指定します。 172 @return なし。 173 */ SetBlockAlignment(BlockAlignment align)174 inline void SetBlockAlignment( BlockAlignment align ) 175 { 176 detail::SetBlockAlignment(align); 177 } 178 /*! 179 @brief 出力バッファのデータの並び方を取得します。 180 181 @return 設定されているデータの並び方が返ります。 182 */ GetBlockAlignment(void)183 inline BlockAlignment GetBlockAlignment( void ) 184 { 185 return detail::GetBlockAlignment(); 186 } 187 /*! 188 @brief 出力画像への空間的ディザリングを有効にするか設定します。 189 190 @param[in] enable 有効にするならば true, そうでないなら false を指定します。 191 @return なし。 192 */ SetSpacialDithering(bool enable)193 inline void SetSpacialDithering( bool enable ) 194 { 195 detail::SetSpacialDithering(enable); 196 } 197 /*! 198 @brief 出力画像への空間的ディザリングが有効になっているかチェックします。 199 200 @return 有効になっていれば true, そうでなければ false を返します。 201 */ GetSpacialDithering(void)202 inline bool GetSpacialDithering( void ) 203 { 204 return detail::GetSpacialDithering(); 205 } 206 /*! 207 @brief 出力画像への時間的ディザリングを有効にするか設定します。 208 初期値は false です。 209 210 @param[in] enable 有効にするならば true, そうでないなら false を指定します。 211 @return なし。 212 */ SetTemporalDithering(bool enable)213 inline void SetTemporalDithering( bool enable ) 214 { 215 detail::SetTemporalDithering(enable); 216 } 217 /*! 218 @brief 出力画像への時間的ディザリングが有効になっているかチェックします。 219 初期値は false です。 220 221 @return 有効になっていれば true, そうでなければ false を返します。 222 */ GetTemporalDithering(void)223 inline bool GetTemporalDithering( void ) 224 { 225 return detail::GetTemporalDithering(); 226 } 227 /*! 228 @brief データ転送終了割り込みを許可するか設定します。 229 初期値は true です。 230 231 @param[in] enable 許可するならば true, そうでないなら false を指定します。 232 @return なし。 233 */ SetTransferEndInterrupt(bool enable)234 inline void SetTransferEndInterrupt( bool enable ) 235 { 236 detail::SetTransferEndInterrupt(enable); 237 } 238 /*! 239 @brief データ転送終了割り込みを許可しているかチェックします。 240 241 @return 許可されていれば true, そうでなければ false を返します。 242 */ GetTransferEndInterrupt(void)243 inline bool GetTransferEndInterrupt( void ) 244 { 245 return detail::GetTransferEndInterrupt(); 246 } 247 /*! 248 @brief データ転送終了割り込みの発生を検知するためのイベントを取得します。 249 250 @param[out] pEvent データ転送終了時に起こされるイベントです。 251 @return なし。 252 */ GetTransferEndEvent(nn::os::Event * pEvent)253 inline void GetTransferEndEvent( nn::os::Event* pEvent ) 254 { 255 detail::GetTransferEndEvent(pEvent); 256 } 257 /*! 258 @brief Yデータを書き込む設定をします。実際の転送処理は StartConversion を呼び出した後に行われます。 259 260 @param[in] pSrc 転送する画像データを指定します。 261 @param[in] imageSize 転送する合計サイズを指定します。transferUnit の整数倍の必要があります。 262 @param[in] transferUnit 1回の転送サイズ(1ライン)を指定します。 263 @param[in] transferStride 1回の転送毎に転送元アドレスに transferUnit とは別に加算されるオフセット値を指定します。 264 265 @return なし。 266 */ 267 inline void SetSendingY( const void* pSrc, size_t imageSize, s16 transferUnit, s16 transferStride = 0 ) 268 { 269 detail::SetSendingY(reinterpret_cast<u32>(pSrc), imageSize, transferUnit, transferStride); 270 } 271 /*! 272 @brief Uデータを書き込む設定をします。実際の転送処理は StartConversion を呼び出した後に行われます。 273 274 @param[in] pSrc 転送する画像データを指定します。 275 @param[in] imageSize 転送する合計サイズを指定します。transferUnit の整数倍の必要があります。 276 @param[in] transferUnit 1回の転送サイズ(1ライン)を指定します。 277 @param[in] transferStride 1回の転送毎に転送元アドレスに transferUnit とは別に加算されるオフセット値を指定します。 278 @return なし。 279 */ 280 inline void SetSendingU( const void* pSrc, size_t imageSize, s16 transferUnit, s16 transferStride = 0 ) 281 { 282 detail::SetSendingU(reinterpret_cast<u32>(pSrc), imageSize, transferUnit, transferStride); 283 } 284 /*! 285 @brief Vデータを書き込む設定をします。実際の転送処理は StartConversion を呼び出した後に行われます。 286 287 @param[in] pSrc 転送する画像データを指定します。 288 @param[in] imageSize 転送する合計サイズを指定します。transferUnit の整数倍の必要があります。 289 @param[in] transferUnit 1回の転送サイズ(1ライン)を指定します。 290 @param[in] transferStride 1回の転送毎に転送元アドレスに transferUnit とは別に加算されるオフセット値を指定します。 291 @return なし。 292 */ 293 inline void SetSendingV( const void* pSrc, size_t imageSize, s16 transferUnit, s16 transferStride = 0 ) 294 { 295 detail::SetSendingV(reinterpret_cast<u32>(pSrc), imageSize, transferUnit, transferStride); 296 } 297 /*! 298 @brief YUVデータを書き込む設定をします。実際の転送処理は StartConversion を呼び出した後に行われます。 299 300 @param[in] pSrc 転送する画像データを指定します。 301 @param[in] imageSize 転送する合計サイズを指定します。transferUnit の整数倍の必要があります。 302 @param[in] transferUnit 1回の転送サイズ(1ライン)を指定します。 303 @param[in] transferStride 1回の転送毎に転送元アドレスに transferUnit とは別に加算されるオフセット値を指定します。 304 @return なし。 305 */ 306 inline void SetSendingYuv( const void* pSrc, size_t imageSize, s16 transferUnit, s16 transferStride = 0 ) 307 { 308 detail::SetSendingYuv(reinterpret_cast<u32>(pSrc), imageSize, transferUnit, transferStride); 309 } 310 /*! 311 @brief YUVデータの書き込みが終了したかチェックします。 312 313 @return 転送が完了していれば true, 終了していなければ false が返ります。 314 */ IsFinishedSendingYuv(void)315 inline bool IsFinishedSendingYuv( void ) 316 { 317 return detail::IsFinishedSendingYuv(); 318 } 319 /*! 320 @brief Yデータの書き込みが終了したかチェックします。 321 322 @return 転送が完了していれば true, 終了していなければ false が返ります。 323 */ IsFinishedSendingY(void)324 inline bool IsFinishedSendingY( void ) 325 { 326 return detail::IsFinishedSendingY(); 327 } 328 /*! 329 @brief Uデータの書き込みが終了したかチェックします。 330 331 @return 転送が完了していれば true, 終了していなければ false が返ります。 332 */ IsFinishedSendingU(void)333 inline bool IsFinishedSendingU( void ) 334 { 335 return detail::IsFinishedSendingU(); 336 } 337 /*! 338 @brief Vデータの書き込みが終了したかチェックします。 339 340 @return 転送が完了していれば true, 終了していなければ false が返ります。 341 */ IsFinishedSendingV(void)342 inline bool IsFinishedSendingV( void ) 343 { 344 return detail::IsFinishedSendingV(); 345 } 346 /*! 347 @brief RGBデータを読み込む設定をします。実際の転送処理は StartConversion を呼び出した後に行われます。 348 349 @param[in] pDst 画像データが転送されます。 350 @param[in] imageSize 転送する合計サイズを指定します。transferUnit の整数倍の必要があります。 351 @param[in] transferUnit 1回の転送サイズを指定します。パフォーマンスを上げるために、8 ライン分のサイズを指定することを推奨します。 352 @param[in] transferStride 1回の転送毎に転送先アドレスに transferUnit とは別に加算されるオフセット値を指定します。 353 1ライン毎にオフセットを加えたい場合は、transferUnit に 1 ライン分のサイズを指定する必要があります。 354 @return なし。 355 */ 356 inline void SetReceiving( void* pDst, size_t imageSize, s16 transferUnit, s16 transferStride = 0 ) 357 { 358 detail::SetReceiving(reinterpret_cast<u32>(pDst), imageSize, transferUnit, transferStride); 359 } 360 /*! 361 @brief 読み込みが終了したかチェックします。 362 363 @return 転送が終了していれば true, 終了していなければ false が返ります。 364 */ IsFinishedReceiving(void)365 inline bool IsFinishedReceiving( void ) 366 { 367 return detail::IsFinishedReceiving(); 368 } 369 /*! 370 @brief 入力データの 1 ラインの幅を設定します。 371 372 1024 以下の 8 の倍数にする必要があります。 373 374 @param[in] width ドット数を指定します。 375 @return なし。 376 */ SetInputLineWidth(s16 width)377 inline void SetInputLineWidth( s16 width ) 378 { 379 detail::SetInputLineWidth(width); 380 } 381 /*! 382 @brief 入力データの 1 ラインの幅を取得します。 383 384 @return 設定されているドット数が返ります。 385 */ GetInputLineWidth(void)386 inline s16 GetInputLineWidth( void ) 387 { 388 return detail::GetInputLineWidth(); 389 } 390 /*! 391 @brief 入力データの縦のライン数を設定します。 392 393 @param[in] lines ライン数を指定します。 394 @return なし。 395 */ SetInputLines(s16 lines)396 inline void SetInputLines( s16 lines ) 397 { 398 detail::SetInputLines(lines); 399 } 400 /*! 401 @brief 入力データの縦のライン数を取得します。 402 403 @return 設定されているライン数が返ります。 404 */ GetInputLines(void)405 inline s16 GetInputLines( void ) 406 { 407 return detail::GetInputLines(); 408 } 409 /*! 410 @brief 指定した出力形式の 1 画素あたりのバイト数を計算します。 411 412 @param[in] format 出力形式を指定します。 413 @return バイト数を返します。 414 */ GetOutputFormatBytes(OutputFormat format)415 inline size_t GetOutputFormatBytes( OutputFormat format ) 416 { 417 return detail::GetOutputFormatBytes(format); 418 } 419 /*! 420 @brief 出力ブロックサイズを計算します。 421 422 @param[in] lineWidth 1 ラインの幅を指定します。 423 @param[in] format 出力形式を指定します。 424 @return ブロックサイズのバイト数が返ります。 425 */ GetOutputBlockSize(s16 lineWidth,OutputFormat format)426 inline size_t GetOutputBlockSize( s16 lineWidth, OutputFormat format ) 427 { 428 return detail::GetOutputBlockSize(lineWidth, format); 429 } 430 /*! 431 @brief 出力画像のサイズを計算します。 432 433 @param[in] lineWidth 1 ラインの幅を指定します。 434 @param[in] height 縦のライン数を指定します。 435 @param[in] format 出力形式を指定します。 436 @return 出力画像のサイズが返ります。 437 */ GetOutputImageSize(s16 lineWidth,s16 height,OutputFormat format)438 inline size_t GetOutputImageSize( s16 lineWidth, s16 height, OutputFormat format ) 439 { 440 return detail::GetOutputImageSize(lineWidth, height, format); 441 } 442 /*! 443 @brief 変換係数を設定します。 444 445 :private 446 447 @param[in] src 変換係数を指定します。 448 @return なし。 449 */ SetCoefficientParams(CoefficientParams src)450 inline void SetCoefficientParams( CoefficientParams src ) 451 { 452 detail::SetCoefficientParams(src); 453 } 454 /*! 455 @brief 変換係数を取得します。 456 457 :private 458 459 @param[out] pDst 設定されている変換係数が返ります。 460 @return なし。 461 */ GetCoefficientParams(CoefficientParams * pDst)462 inline void GetCoefficientParams( CoefficientParams* pDst ) 463 { 464 detail::GetCoefficientParams(pDst); 465 } 466 /*! 467 @brief 標準的な変換係数を設定します。 468 469 @param[in] no 標準的な変換係数のタイプを指定します。 470 @return なし。 471 */ SetStandardCoefficient(StandardCoefficient no)472 inline void SetStandardCoefficient( StandardCoefficient no ) 473 { 474 detail::SetStandardCoefficient(no); 475 } 476 /*! 477 @brief 標準的な変換係数を取得します。 478 479 :private 480 481 @param[out] pDst 標準的な変換係数が返ります。 482 @param[in] no 標準的な変換係数のタイプを指定します。 483 @return なし。 484 */ GetStandardCoefficientParams(CoefficientParams * pDst,StandardCoefficient no)485 inline void GetStandardCoefficientParams( CoefficientParams* pDst, StandardCoefficient no ) 486 { 487 detail::GetStandardCoefficientParams(pDst, no); 488 } 489 /*! 490 @brief 出力フォーマットが RGB32bit 及び RGB555 の場合のアルファ値を設定します。 491 492 @param[in] alpha アルファ値を指定します。 493 @return なし。 494 */ SetAlpha(s16 alpha)495 inline void SetAlpha( s16 alpha ) 496 { 497 detail::SetAlpha(alpha); 498 } 499 /*! 500 @brief 出力フォーマットが RGB32bit 及び RGB555 の場合のアルファ値を取得します。 501 502 @return 設定されているアルファ値が返ります。 503 */ GetAlpha(void)504 inline s16 GetAlpha( void ) 505 { 506 return detail::GetAlpha(); 507 } 508 /*! 509 @brief ディザリングパターンを設定します。 510 511 @param[in] w ディザリングの重みを指定します。 512 @return なし。 513 */ SetDitheringWeightParams(const DitheringWeightParams & w)514 inline void SetDitheringWeightParams( const DitheringWeightParams & w ) 515 { 516 detail::SetDitheringWeightParams(w); 517 } 518 /*! 519 @brief ディザリングパターンを取得します。 520 521 @param[out] pW 設定されているディザリングの重みが返ります。 522 @return なし。 523 */ GetDitheringWeightParams(DitheringWeightParams * pW)524 inline void GetDitheringWeightParams( DitheringWeightParams* pW ) 525 { 526 detail::GetDitheringWeightParams(pW); 527 } 528 /*! 529 @brief 変換を開始します。 530 531 @return 関数の実行結果を返します。以下に挙げる Result を返します。 532 @retval ResultSuccess 処理に成功しました。 533 @retval ResultIsSleeping スリープ中であるため使用できません。 534 */ StartConversion(void)535 inline nn::Result StartConversion( void ) 536 { 537 return detail::StartConversion(); 538 } 539 /*! 540 @brief 変換を強制終了します。 541 542 @return なし。 543 */ StopConversion(void)544 inline void StopConversion( void ) 545 { 546 detail::StopConversion(); 547 } 548 /*! 549 @brief 変換中であるかチェックします。 550 551 @return 変換中であれば true, そうでなければ false を返します。 552 */ IsBusyConversion(void)553 inline bool IsBusyConversion( void ) 554 { 555 return detail::IsBusyConversion(); 556 } 557 558 /*! 559 @brief Y2R の設定を一括して設定します。 560 561 @param[in] param 設定するパラメータです。 562 @return なし。 563 */ SetPackageParameter(const PackageParameter & param)564 inline void SetPackageParameter(const PackageParameter& param) 565 { 566 return detail::SetPackageParameter( param ); 567 } 568 } 569 } 570 } 571 572 #endif // ifndef NN_Y2R_CTR_Y2R_API_H_ 573