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

Last change on this file since 671 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
RevLine 
[608]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
[56]36#include "TAppExtrTop.h"
37#include "../../Lib/TLibDecoder/AnnexBread.h"
38#include <fstream>
[42]39#include <list>
40#include <stdio.h>
41#include <fcntl.h>
42#include <assert.h>
43
[608]44#if H_MV
[42]45// ====================================================================================================================
46// Constructor / destructor / initialization / destroy
47// ====================================================================================================================
48
49TAppExtrTop::TAppExtrTop()
50{
[608]51  // To suppress compiler warnings on potential division by 0.
52  g_uiMaxCUWidth  = 1;
53  g_uiMaxCUHeight = 1;
[42]54}
55
[56]56TAppExtrTop::~TAppExtrTop()
[42]57{
58}
59
60// ====================================================================================================================
61// Public member functions
62// ====================================================================================================================
63
[608]64//
65//until the end of the bitstream, call extraction function in TExtrTop class
66//
67
[42]68Void TAppExtrTop::extract()
69{
70
[56]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  }
[42]77
[56]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  }
[42]88
[56]89  InputByteStream inputBytestream( inputBitstreamFile );
90
91  Bool bEndOfFile = false;
92  while( !bEndOfFile )
[42]93  {
[56]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() )
[42]102    {
[56]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" );
[42]109    }
[56]110    else
111    {
112      read( nalu, nalUnit );
[42]113
[56]114      // decide whether to extract packet or not
115      if ( m_cTExtrTop.extract( nalu, m_suiExtractLayerIds ) && outputBitstreamFile.is_open() )
[42]116      {
[56]117        inputBitstreamFile.clear();
118
119        streampos location2 = inputBitstreamFile.tellg();
120        inputBitstreamFile.seekg( location );
121
122        do
[42]123        {
[56]124          outputBitstreamFile.put( inputBitstreamFile.get() );
125        } while( inputBitstreamFile.tellg() != location2 );
[42]126      }
127    }
128  }
129
[56]130  inputBitstreamFile.close();
131  outputBitstreamFile.close();
132
[608]133
[42]134  // write SPS info file
135  if ( m_pchSpsInfoFile )
136  {
[56]137    fstream cSpsInfoFileHandle( m_pchSpsInfoFile, fstream::binary | fstream::out );
[42]138
[56]139    if( cSpsInfoFileHandle.fail() )
[42]140    {
[56]141      fprintf( stderr, "\nfailed writing SPS info file\n" );
142      exit( EXIT_FAILURE );
[42]143    }
144
[56]145    m_cTExtrTop.dumpSpsInfo( cSpsInfoFileHandle );
[42]146
[56]147    cSpsInfoFileHandle.close();
[42]148  }
[608]149
150  m_cTExtrTop.dumpVpsInfo( std::cout ); 
[56]151  m_cTExtrTop.dumpSpsInfo( std::cout );
[608]152
[42]153}
[608]154#endif
Note: See TracBrowser for help on using the repository browser.