source: 3DVCSoftware/trunk/source/App/TAppExtractor/TAppExtrTop.cpp @ 664

Last change on this file since 664 was 608, checked in by tech, 11 years ago

Merged DEV-2.0-dev0@604.

  • Property svn:eol-style set to native
File size: 5.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-2011, 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 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     TAppExtrTop.cpp
35//    \brief    Extractor application class
36#include "TAppExtrTop.h"
37#include "../../Lib/TLibDecoder/AnnexBread.h"
38#include <fstream>
39#include <list>
40#include <stdio.h>
41#include <fcntl.h>
42#include <assert.h>
43
44#if H_MV
45// ====================================================================================================================
46// Constructor / destructor / initialization / destroy
47// ====================================================================================================================
48
49TAppExtrTop::TAppExtrTop()
50{
51  // To suppress compiler warnings on potential division by 0.
52  g_uiMaxCUWidth  = 1;
53  g_uiMaxCUHeight = 1;
54}
55
56TAppExtrTop::~TAppExtrTop()
57{
58}
59
60// ====================================================================================================================
61// Public member functions
62// ====================================================================================================================
63
64//
65//until the end of the bitstream, call extraction function in TExtrTop class
66//
67
68Void TAppExtrTop::extract()
69{
70
71  ifstream inputBitstreamFile( m_pchInputBitstreamFile, ifstream::in | ifstream::binary );
72  if( inputBitstreamFile.fail() )
73  {
74    fprintf( stderr, "\nfailed to open bitstream file `%s' for reading\n", m_pchInputBitstreamFile );
75    exit( EXIT_FAILURE );
76  }
77
78  fstream outputBitstreamFile;
79  if( m_pchOutputBitstreamFile )
80  {
81    outputBitstreamFile.open( m_pchOutputBitstreamFile, fstream::binary | fstream::out );
82    if( outputBitstreamFile.fail() )
83    {
84      fprintf( stderr, "\nfailed to open bitstream file `%s' for writing\n", m_pchOutputBitstreamFile );
85      exit( EXIT_FAILURE );
86    }
87  }
88
89  InputByteStream inputBytestream( inputBitstreamFile );
90
91  Bool bEndOfFile = false;
92  while( !bEndOfFile )
93  {
94    streampos location = inputBitstreamFile.tellg();
95    AnnexBStats stats = AnnexBStats();
96    vector<uint8_t> nalUnit;
97    InputNALUnit nalu;
98    bEndOfFile = byteStreamNALUnit( inputBytestream, nalUnit, stats );
99
100    // handle NAL unit
101    if( nalUnit.empty() )
102    {
103      /* this can happen if the following occur:
104       *  - empty input file
105       *  - two back-to-back start_code_prefixes
106       *  - start_code_prefix immediately followed by EOF
107       */
108      fprintf( stderr, "Warning: Attempt to decode an empty NAL unit\n" );
109    }
110    else
111    {
112      read( nalu, nalUnit );
113
114      // decide whether to extract packet or not
115      if ( m_cTExtrTop.extract( nalu, m_suiExtractLayerIds ) && outputBitstreamFile.is_open() )
116      {
117        inputBitstreamFile.clear();
118
119        streampos location2 = inputBitstreamFile.tellg();
120        inputBitstreamFile.seekg( location );
121
122        do
123        {
124          outputBitstreamFile.put( inputBitstreamFile.get() );
125        } while( inputBitstreamFile.tellg() != location2 );
126      }
127    }
128  }
129
130  inputBitstreamFile.close();
131  outputBitstreamFile.close();
132
133
134  // write SPS info file
135  if ( m_pchSpsInfoFile )
136  {
137    fstream cSpsInfoFileHandle( m_pchSpsInfoFile, fstream::binary | fstream::out );
138
139    if( cSpsInfoFileHandle.fail() )
140    {
141      fprintf( stderr, "\nfailed writing SPS info file\n" );
142      exit( EXIT_FAILURE );
143    }
144
145    m_cTExtrTop.dumpSpsInfo( cSpsInfoFileHandle );
146
147    cSpsInfoFileHandle.close();
148  }
149
150  m_cTExtrTop.dumpVpsInfo( std::cout ); 
151  m_cTExtrTop.dumpSpsInfo( std::cout );
152
153}
154#endif
Note: See TracBrowser for help on using the repository browser.