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: 22311 $
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();
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       処理の結果が返ってきます。<BR>
532                     LEVEL_SUCCESS:SUMMARY_SUCCESS:MODULE_COMMON:DESCRIPTION_SUCCESS ・・・ 成功しました。<BR>
533                     LEVEL_STATUS:SUMMARY_STATUS_CHANGED:MODULE_NN_CAMERA:DESCRIPTION_Y2R_IS_SLEEPING ・・・スリープ中であるため使用できません。<BR>
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