source: 3DVCSoftware/branches/HTM-16.1-dev/source/Lib/TLibCommon/TComPic.h @ 1402

Last change on this file since 1402 was 1402, checked in by tech, 9 years ago

Initial merge of HM-16.9.

  • Property svn:eol-style set to native
File size: 21.2 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license.
5 *
6 * Copyright (c) 2010-2016, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TComPic.h
35    \brief    picture class (header)
36*/
37
38#ifndef __TCOMPIC__
39#define __TCOMPIC__
40
41// Include files
42#include "CommonDef.h"
43#include "TComPicSym.h"
44#include "TComPicYuv.h"
45#include "TComBitStream.h"
46
47//! \ingroup TLibCommon
48//! \{
49
50// ====================================================================================================================
51// Class definition
52// ====================================================================================================================
53
54/// picture class (symbol + YUV buffers)
55
56
57
58#if NH_MV
59class TComPic; 
60
61class TComDecodedRps
62{
63public: 
64
65  TComDecodedRps()
66  {
67    m_refPicSetsCurr[0] = &m_refPicSetStCurrBefore;
68    m_refPicSetsCurr[1] = &m_refPicSetStCurrAfter ;
69    m_refPicSetsCurr[2] = &m_refPicSetLtCurr      ; 
70
71    m_refPicSetsLt  [0] = &m_refPicSetLtCurr      ; 
72    m_refPicSetsLt  [1] = &m_refPicSetLtFoll      ;
73
74    m_refPicSetsAll [0] = &m_refPicSetStCurrBefore;
75    m_refPicSetsAll [1] = &m_refPicSetStCurrAfter ;
76    m_refPicSetsAll [2] = &m_refPicSetStFoll      ;
77    m_refPicSetsAll [3] = &m_refPicSetLtCurr      ;
78    m_refPicSetsAll [4] = &m_refPicSetLtFoll      ;
79  };   
80
81  std::vector<Int>       m_pocStCurrBefore;
82  std::vector<Int>       m_pocStCurrAfter;
83  std::vector<Int>       m_pocStFoll;   
84  std::vector<Int>       m_pocLtCurr;
85  std::vector<Int>       m_pocLtFoll; 
86
87  Int                    m_numPocStCurrBefore;
88  Int                    m_numPocStCurrAfter;
89  Int                    m_numPocStFoll;
90  Int                    m_numPocLtCurr;
91  Int                    m_numPocLtFoll;
92
93  std::vector<TComPic*>  m_refPicSetStCurrBefore; 
94  std::vector<TComPic*>  m_refPicSetStCurrAfter; 
95  std::vector<TComPic*>  m_refPicSetStFoll; 
96  std::vector<TComPic*>  m_refPicSetLtCurr; 
97  std::vector<TComPic*>  m_refPicSetLtFoll;   
98
99  std::vector<TComPic*>* m_refPicSetsCurr[3];
100  std::vector<TComPic*>* m_refPicSetsLt  [2];
101  std::vector<TComPic*>* m_refPicSetsAll [5];
102
103  // Annex F
104  Int                    m_numActiveRefLayerPics0;
105  Int                    m_numActiveRefLayerPics1;     
106
107  std::vector<TComPic*>  m_refPicSetInterLayer0;
108  std::vector<TComPic*>  m_refPicSetInterLayer1;
109};
110#endif
111
112class TComPic
113{
114public:
115  typedef enum { PIC_YUV_ORG=0, PIC_YUV_REC=1, PIC_YUV_TRUE_ORG=2, NUM_PIC_YUV=3 } PIC_YUV_T;
116     // TRUE_ORG is the input file without any pre-encoder colour space conversion (but with possible bit depth increment)
117  TComPicYuv*   getPicYuvTrueOrg()        { return  m_apcPicYuv[PIC_YUV_TRUE_ORG]; }
118
119private:
120  UInt                  m_uiTLayer;               //  Temporal layer
121  Bool                  m_bUsedByCurr;            //  Used by current picture
122  Bool                  m_bIsLongTerm;            //  IS long term picture
123  TComPicSym            m_picSym;                 //  Symbol
124  TComPicYuv*           m_apcPicYuv[NUM_PIC_YUV];
125
126  TComPicYuv*           m_pcPicYuvPred;           //  Prediction
127  TComPicYuv*           m_pcPicYuvResi;           //  Residual
128  Bool                  m_bReconstructed;
129  Bool                  m_bNeededForOutput;
130
131  UInt                  m_uiCurrSliceIdx;         // Index of current slice
132  Bool                  m_bCheckLTMSB;
133
134  Bool                  m_isTop;
135  Bool                  m_isField;
136
137  std::vector<std::vector<TComDataCU*> > m_vSliceCUDataLink;
138
139  SEIMessages  m_SEIs; ///< Any SEI messages that have been received.  If !NULL we own the object.
140#if NH_MV
141  Int                   m_layerId;
142  Int                   m_viewId;
143  Bool                  m_bPicOutputFlag;                // Semantics variable
144  Bool                  m_hasGeneratedRefPics; 
145  Bool                  m_isPocResettingPic; 
146  Bool                  m_isFstPicOfAllLayOfPocResetPer; 
147  Int64                 m_decodingOrder; 
148  Bool                  m_noRaslOutputFlag; 
149  Bool                  m_noClrasOutputFlag; 
150  Int                   m_picLatencyCount; 
151  Bool                  m_isGenerated;
152  Bool                  m_isGeneratedCl833; 
153  Bool                  m_activatesNewVps;
154  TComDecodedRps        m_decodedRps;
155#endif
156#if NH_3D_VSO || NH_3D
157  Int                   m_viewIndex;
158  Bool                  m_isDepth;
159  Int**                 m_aaiCodedScale;
160  Int**                 m_aaiCodedOffset;
161#if NH_3D_QTLPC
162  Bool                  m_bReduceBitsQTL;
163#endif
164#if NH_3D_NBDV
165  UInt                   m_uiRapRefIdx;
166  RefPicList             m_eRapRefList;
167  Int                    m_iNumDdvCandPics;
168  Bool                   m_abTIVRINCurrRL [2][2][MAX_NUM_REF]; //whether an inter-view reference picture with the same view index of the inter-view reference picture of temporal reference picture of current picture exists in current reference picture lists
169  Int                    m_aiTexToDepRef  [2][MAX_NUM_REF];
170#endif
171#endif
172public:
173  TComPic();
174  virtual ~TComPic();
175
176  Void          create( const TComSPS &sps, const TComPPS &pps, const Bool bIsVirtual /*= false*/ );
177
178  virtual Void  destroy();
179
180  UInt          getTLayer() const               { return m_uiTLayer;   }
181  Void          setTLayer( UInt uiTLayer ) { m_uiTLayer = uiTLayer; }
182
183  Bool          getUsedByCurr() const            { return m_bUsedByCurr; }
184  Void          setUsedByCurr( Bool bUsed ) { m_bUsedByCurr = bUsed; }
185  Bool          getIsLongTerm() const            { return m_bIsLongTerm; }
186  Void          setIsLongTerm( Bool lt ) { m_bIsLongTerm = lt; }
187  Void          setCheckLTMSBPresent     (Bool b ) {m_bCheckLTMSB=b;}
188  Bool          getCheckLTMSBPresent     () { return m_bCheckLTMSB;}
189
190  TComPicSym*   getPicSym()           { return  &m_picSym;    }
191  const TComPicSym* getPicSym() const { return  &m_picSym;    }
192  TComSlice*    getSlice(Int i)       { return  m_picSym.getSlice(i);  }
193  const TComSlice* getSlice(Int i) const           { return  m_picSym.getSlice(i);  }
194  Int           getPOC() const        { return  m_picSym.getSlice(m_uiCurrSliceIdx)->getPOC();  }
195  TComDataCU*   getCtu( UInt ctuRsAddr )           { return  m_picSym.getCtu( ctuRsAddr ); }
196  const TComDataCU* getCtu( UInt ctuRsAddr ) const { return  m_picSym.getCtu( ctuRsAddr ); }
197
198  TComPicYuv*   getPicYuvOrg()        { return  m_apcPicYuv[PIC_YUV_ORG]; }
199  TComPicYuv*   getPicYuvRec()        { return  m_apcPicYuv[PIC_YUV_REC]; }
200
201  TComPicYuv*   getPicYuvPred()       { return  m_pcPicYuvPred; }
202  TComPicYuv*   getPicYuvResi()       { return  m_pcPicYuvResi; }
203  Void          setPicYuvPred( TComPicYuv* pcPicYuv )       { m_pcPicYuvPred = pcPicYuv; }
204  Void          setPicYuvResi( TComPicYuv* pcPicYuv )       { m_pcPicYuvResi = pcPicYuv; }
205
206  UInt          getNumberOfCtusInFrame() const     { return m_picSym.getNumberOfCtusInFrame(); }
207  UInt          getNumPartInCtuWidth() const       { return m_picSym.getNumPartInCtuWidth();   }
208  UInt          getNumPartInCtuHeight() const      { return m_picSym.getNumPartInCtuHeight();  }
209  UInt          getNumPartitionsInCtu() const      { return m_picSym.getNumPartitionsInCtu();  }
210  UInt          getFrameWidthInCtus() const        { return m_picSym.getFrameWidthInCtus();    }
211  UInt          getFrameHeightInCtus() const       { return m_picSym.getFrameHeightInCtus();   }
212  UInt          getMinCUWidth() const              { return m_picSym.getMinCUWidth();          }
213  UInt          getMinCUHeight() const             { return m_picSym.getMinCUHeight();         }
214
215  Int           getStride(const ComponentID id) const          { return m_apcPicYuv[PIC_YUV_REC]->getStride(id); }
216  Int           getComponentScaleX(const ComponentID id) const    { return m_apcPicYuv[PIC_YUV_REC]->getComponentScaleX(id); }
217  Int           getComponentScaleY(const ComponentID id) const    { return m_apcPicYuv[PIC_YUV_REC]->getComponentScaleY(id); }
218  ChromaFormat  getChromaFormat() const                           { return m_apcPicYuv[PIC_YUV_REC]->getChromaFormat(); }
219  Int           getNumberValidComponents() const                  { return m_apcPicYuv[PIC_YUV_REC]->getNumberValidComponents(); }
220
221  Void          setReconMark (Bool b) { m_bReconstructed = b;     }
222  Bool          getReconMark () const      { return m_bReconstructed;  }
223  Void          setOutputMark (Bool b) { m_bNeededForOutput = b;     }
224  Bool          getOutputMark () const      { return m_bNeededForOutput;  }
225
226#if !NH_3D
227  Void          compressMotion();
228#endif
229  UInt          getCurrSliceIdx() const           { return m_uiCurrSliceIdx;                }
230  Void          setCurrSliceIdx(UInt i)      { m_uiCurrSliceIdx = i;                   }
231  UInt          getNumAllocatedSlice() const      {return m_picSym.getNumAllocatedSlice();}
232  Void          allocateNewSlice()           {m_picSym.allocateNewSlice();         }
233  Void          clearSliceBuffer()           {m_picSym.clearSliceBuffer();         }
234
235  const Window& getConformanceWindow() const { return m_picSym.getSPS().getConformanceWindow(); }
236  Window        getDefDisplayWindow() const  { return m_picSym.getSPS().getVuiParametersPresentFlag() ? m_picSym.getSPS().getVuiParameters()->getDefaultDisplayWindow() : Window(); }
237
238  Bool          getSAOMergeAvailability(Int currAddr, Int mergeAddr);
239
240  UInt          getSubstreamForCtuAddr(const UInt ctuAddr, const Bool bAddressInRaster, TComSlice *pcSlice);
241
242  /* field coding parameters*/
243
244   Void              setTopField(Bool b)                  {m_isTop = b;}
245   Bool              isTopField()                         {return m_isTop;}
246   Void              setField(Bool b)                     {m_isField = b;}
247   Bool              isField()                            {return m_isField;}
248
249#if NH_MV
250   Void          setLayerId            ( Int layerId )    { m_layerId      = layerId; }
251   Int           getLayerId            () const           { return m_layerId;    }
252   
253   Void          setViewId             ( Int viewId )     { m_viewId = viewId;   }
254   Int           getViewId             () const           { return m_viewId;     }
255
256   Void          setPicOutputFlag(Bool b)                 { m_bPicOutputFlag = b;      }
257   Bool          getPicOutputFlag() const                 { return m_bPicOutputFlag ;  }
258
259   Bool          getPocResetPeriodId();
260
261   Void          markAsUsedForShortTermReference();
262   Void          markAsUsedForLongTermReference(); 
263   Void          markAsUnusedForReference(); 
264
265   Bool          getMarkedUnUsedForReference();
266   Bool          getMarkedAsShortTerm();
267
268   Void          setHasGeneratedRefPics(Bool val)       { m_hasGeneratedRefPics  = val;    }
269   Bool          getHasGeneratedRefPics( )              { return m_hasGeneratedRefPics;   }
270
271   Void          setIsPocResettingPic(Bool val)         { m_isPocResettingPic = val;    }
272   Bool          getIsPocResettingPic( )                { return m_isPocResettingPic;   }
273
274   Void          setIsFstPicOfAllLayOfPocResetPer(Bool val) { m_isFstPicOfAllLayOfPocResetPer = val;  }
275   Bool          getIsFstPicOfAllLayOfPocResetPer( )        { return m_isFstPicOfAllLayOfPocResetPer; }
276
277   Int64         getDecodingOrder( )                    { return m_decodingOrder;       }
278   Void          setDecodingOrder( UInt64 val  )        { m_decodingOrder = val;        }
279
280   Bool          getNoRaslOutputFlag()                  { return m_noRaslOutputFlag;     }
281   Void          setNoRaslOutputFlag( Bool b )          { m_noRaslOutputFlag = b;        }
282
283   Bool          getNoClrasOutputFlag()                 { return m_noClrasOutputFlag;    }
284   Void          setNoClrasOutputFlag( Bool b )         { m_noClrasOutputFlag = b;       }
285
286   Int           getPicLatencyCount()                   { return m_picLatencyCount;      }
287   Void          setPicLatencyCount( Int val )          { m_picLatencyCount = val;       }
288
289   Bool          getIsGenerated() const                 { return m_isGenerated;          }
290   Void          setIsGenerated( Bool b )               { m_isGenerated = b;             }
291
292   Bool          getIsGeneratedCl833() const            { return m_isGeneratedCl833;     }
293   Void          setIsGeneratedCl833( Bool b )          { m_isGeneratedCl833 = b;        }
294
295   Int           getTemporalId( )                       { return getSlice(0)->getTemporalId(); }
296
297   Bool          getActivatesNewVps()                   { return m_activatesNewVps;      }
298   Void          setActivatesNewVps( Bool b )           { m_activatesNewVps = b;         }
299
300   TComDecodedRps* getDecodedRps()                      { return &m_decodedRps;          }
301
302   Bool          isIrap()                               { return getSlice(0)->isIRAP(); } 
303   Bool          isBla ()                               { return getSlice(0)->isBla (); } 
304   Bool          isIdr ()                               { return getSlice(0)->isIdr (); } 
305   Bool          isCra ()                               { return getSlice(0)->isCra (); } 
306   Bool          isSlnr ()                              { return getSlice(0)->isSlnr (); }
307   Bool          isRasl ()                              { return getSlice(0)->isRasl (); }
308   Bool          isRadl ()                              { return getSlice(0)->isRadl (); }
309   Bool          isStsa ()                              { return getSlice(0)->isStsa (); }
310   Bool          isTsa ()                               { return getSlice(0)->isTsa  (); }
311
312   Void          print( Int outputLevel );
313
314#if NH_3D_VSO ||  NH_3D
315   Void          setViewIndex          ( Int viewIndex )  { m_viewIndex = viewIndex;   }
316   Int           getViewIndex          () const           { return m_viewIndex;     }
317
318   Void          setIsDepth            ( Bool isDepth )   { m_isDepth = isDepth; }
319   Bool          getIsDepth            ()                 { return m_isDepth; }
320
321   Void          setScaleOffset( Int** pS, Int** pO )     { m_aaiCodedScale = pS; m_aaiCodedOffset = pO; }
322   Int**         getCodedScale ()                         { return m_aaiCodedScale;  }
323   Int**         getCodedOffset()                         { return m_aaiCodedOffset; }
324
325   Void          compressMotion(Int scale); 
326   Void          printMotion( );
327#if NH_3D_ARP
328   Void          getCUAddrAndPartIdx( Int iX, Int iY, Int& riCuAddr, Int& riAbsZorderIdx );
329#endif
330#if NH_3D_QTLPC
331   Bool          getReduceBitsFlag ()                     { return m_bReduceBitsQTL;     }
332   Void          setReduceBitsFlag ( Bool bFlag )         { m_bReduceBitsQTL = bFlag;    }
333#endif
334#if NH_3D_NBDV
335  Int            getNumDdvCandPics()                      { return m_iNumDdvCandPics;    }
336  Int            getDisCandRefPictures(Int iColPOC);       
337  Void           setRapRefIdx(UInt uiRapRefIdx)           { m_uiRapRefIdx = uiRapRefIdx; }
338  Void           setRapRefList(RefPicList eRefPicList)    { m_eRapRefList = eRefPicList; }
339  Void           setNumDdvCandPics (Int i)                { m_iNumDdvCandPics = i;       }
340  UInt           getRapRefIdx()                           { return m_uiRapRefIdx;        }
341  RefPicList     getRapRefList()                          { return m_eRapRefList;        }
342  Void           checkTemporalIVRef();                     
343  Bool           isTempIVRefValid(Int currCandPic, Int iTempRefDir, Int iTempRefIdx);
344  Void           checkTextureRef(  );
345  Int            isTextRefValid(Int iTextRefDir, Int iTextRefIdx);
346#endif
347#endif
348#endif
349
350  /** transfer ownership of seis to this picture */
351  Void setSEIs(SEIMessages& seis) { m_SEIs = seis; }
352
353  /**
354   * return the current list of SEI messages associated with this picture.
355   * Pointer is valid until this->destroy() is called */
356  SEIMessages& getSEIs() { return m_SEIs; }
357
358  /**
359   * return the current list of SEI messages associated with this picture.
360   * Pointer is valid until this->destroy() is called */
361  const SEIMessages& getSEIs() const { return m_SEIs; }
362};// END CLASS DEFINITION TComPic
363
364#if NH_MV
365
366class TComAu : public TComList<TComPic*>
367{
368 
369public:
370
371  Int                 getPoc            ( )                     {  assert(!empty()); return back()->getPOC            ();  }
372  Void                setPicLatencyCount( Int picLatenyCount );
373  Int                 getPicLatencyCount( )                     {  assert(!empty()); return back()->getPicLatencyCount();  } 
374  TComPic*            getPic            ( Int nuhLayerId  );
375  Void                addPic            ( TComPic* pic, Bool pocUnkown );
376  Bool                containsPic       ( TComPic* pic ); 
377};
378
379
380class TComSubDpb : public TComList<TComPic*>
381{
382private: 
383  Int m_nuhLayerId; 
384public: 
385  TComSubDpb( Int nuhLayerid );
386
387  Int                 getLayerId                      ( ) { return m_nuhLayerId; }
388
389  TComPic*            getPic                          ( Int poc  );
390  TComPic*            getPicFromLsb                   ( Int pocLsb, Int maxPicOrderCntLsb );
391  TComPic*            getShortTermRefPic              ( Int poc  );
392  TComList<TComPic*>  getPicsMarkedNeedForOutput      ( );
393
394  Void                markAllAsUnusedForReference     ( );
395
396  Void                addPic                          ( TComPic* pic );
397  Void                removePics                      ( std::vector<TComPic*> picToRemove );
398  Bool                areAllPicsMarkedNotNeedForOutput( );
399};
400
401class TComPicLists
402{
403private: 
404  TComList<TComAu*    >       m_aus; 
405  TComList<TComSubDpb*>       m_subDpbs; 
406  Bool                        m_printPicOutput; 
407#if NH_3D_VSO || NH_3D
408  const TComVPS*              m_vps; 
409#endif
410public: 
411  TComPicLists() { m_printPicOutput = false; };
412  ~TComPicLists();
413
414  // Add and remove single pictures
415  Void                   addNewPic( TComPic* pic );
416  Void                   removePic( TComPic* pic );
417
418  // Get Pics
419  TComPic*               getPic                         ( Int layerIdInNuh, Int poc );
420  TComPicYuv*            getPicYuv                      ( Int layerIdInNuh, Int poc, Bool recon );
421
422  // Get and AUs and SubDPBs
423  TComSubDpb*            getSubDpb                      ( Int nuhLayerId, Bool create );
424  TComList<TComSubDpb*>* getSubDpbs                     ( );
425                                                       
426  TComAu*                addAu                          ( Int poc  );
427  TComAu*                getAu                          ( Int poc, Bool create );
428  TComList<TComAu*>*     getAus                         ( );
429  TComList<TComAu*>      getAusHavingPicsMarkedForOutput( );
430
431  // Mark pictures and set POCs
432  Void                   markSubDpbAsUnusedForReference ( Int layerIdInNuh );
433  Void                   markSubDpbAsUnusedForReference ( TComSubDpb& subDpb );
434  Void                   markAllSubDpbAsUnusedForReference(  );
435  Void                   decrementPocsInSubDpb          ( Int nuhLayerId, Int deltaPocVal );
436 
437  // Empty Sub DPBs
438  Void                   emptyAllSubDpbs                ( );
439  Void                   emptySubDpbs                   ( TComList<TComSubDpb*>* subDpbs);
440  Void                   emptySubDpb                    ( TComSubDpb* subDpb);
441  Void                   emptySubDpb                    ( Int nuhLayerId );
442
443  Void                   emptyNotNeedForOutputAndUnusedForRef      ( );
444  Void                   emptySubDpbNotNeedForOutputAndUnusedForRef( Int layerId  );
445  Void                   emptySubDpbNotNeedForOutputAndUnusedForRef( TComSubDpb subDpb ); 
446
447  // For printing to std::out
448  Void                   setPrintPicOutput ( Bool printPicOutput ) { m_printPicOutput = printPicOutput; };
449  Void                   print(); 
450
451#if NH_3D_VSO || NH_3D
452  Void                   setVPS                        ( const TComVPS* vps ) { m_vps = vps;  }; 
453#endif
454
455#if NH_3D || NH_3D_VSO
456  TComPic*               getPic                        ( Int viewIndex, Bool depthFlag, Int auxId, Int poc );
457  TComPicYuv*            getPicYuv                     ( Int viewIndex, Bool depthFlag, Int auxId, Int poc, Bool recon );
458#endif 
459
460}; 
461
462// END CLASS DEFINITION TComPicLists
463
464#endif
465
466
467//! \}
468
469#endif // __TCOMPIC__
Note: See TracBrowser for help on using the repository browser.