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