00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "stdafx.h"
00035 #include ".\anxpageinterleaver.h"
00036
00037 AnxPageInterleaver::AnxPageInterleaver(IOggCallback* inFileWriter, INotifyComplete* inNotifier, unsigned long inVersionMajor, unsigned long inVersionMinor, AnxMuxFilter* inParentFilter)
00038 : OggPageInterleaver(inFileWriter, inNotifier)
00039 , mParentFilter(inParentFilter)
00040 , mVersionMajor(inVersionMajor)
00041 , mVersionMinor(inVersionMinor)
00042 , mIsAnxSetup(false)
00043 {
00044
00045
00046
00047
00048 mAnxSerialNo = 999;
00049 }
00050
00051 AnxPageInterleaver::~AnxPageInterleaver(void)
00052 {
00053
00054 }
00055
00056 void AnxPageInterleaver::addAnnodex_2_0_BOS() {
00057
00058
00059
00060 unsigned char* locUTC = new unsigned char[20];
00061 memset((void*)locUTC, 0, 20);
00062
00063 OggPage* locBOSPage = AnxPacketMaker::makeAnnodexBOS_2_0( mAnxSerialNo
00064 , 2
00065 , 0
00066 , 0
00067 , 0
00068 , locUTC);
00069
00070
00071
00072 mBytesWritten += locBOSPage->pageSize();
00073 mFileWriter->acceptOggPage(locBOSPage);
00074 delete locUTC;
00075
00076 }
00077
00078 void AnxPageInterleaver::addAllAnxData_2_0_BOS() {
00079 OggPage* locOggPage = NULL;
00080 for (size_t i = 0; i < mInputStreams.size() - 1; i++) {
00081 locOggPage = mInputStreams[i]->popFront();
00082 mBytesWritten += locOggPage->pageSize();
00083 mFileWriter->acceptOggPage(locOggPage);
00084 mInputStreams[i]->setNumHeaders(mInputStreams[i]->numHeaders() + 1);
00085 }
00086
00087 }
00088
00089 void AnxPageInterleaver::addAnnodexEOS() {
00090
00091
00092 OggPage* locEOSPage = new OggPage;
00093
00094 locEOSPage->header()->setStreamSerialNo(mAnxSerialNo);
00095 locEOSPage->header()->setHeaderFlags(4);
00096
00097
00098 StampedOggPacket* locDudPacket = new StampedOggPacket(NULL, 0, false, false, 0, 0, StampedOggPacket::OGG_BOTH);
00099
00100 locEOSPage->header()->setNumPageSegments(1);
00101 unsigned char* locSegTable = new unsigned char[1];
00102
00103 locSegTable[0] = 0;
00104
00105
00106 locEOSPage->header()->setSegmentTable(locSegTable, 1);
00107 locEOSPage->header()->setHeaderSize(28);
00108 locEOSPage->header()->setDataSize(0);
00109
00110 locEOSPage->addPacket(locDudPacket);
00111
00112 AnxPacketMaker::setChecksum(locEOSPage);
00113 mBytesWritten += locEOSPage->pageSize();
00114 mFileWriter->acceptOggPage(locEOSPage);
00115 }
00116
00117
00118
00119 bool AnxPageInterleaver::gotAllHeaders() {
00120
00121
00122 bool locWasAny = false;
00123 bool locIsOK = true;
00124 for (size_t i = 0; i < mInputStreams.size(); i++) {
00125 if (mInputStreams[i]->isActive()) {
00126
00127
00128 if (mInputStreams[i]->numAvail() > 1) {
00129 locWasAny = true;
00130 locIsOK = locIsOK && true;
00131 } else {
00132 locIsOK = false;
00133 }
00134 }
00135 }
00136
00137 return locWasAny && locIsOK;
00138 }
00139
00140 bool AnxPageInterleaver::gotAllSecondaryHeaders() {
00141
00142
00143 bool locWasAny = false;
00144 bool locIsOK = true;
00145 for (size_t i = 0; i < mInputStreams.size(); i++) {
00146 if (mInputStreams[i]->isActive()) {
00147
00148
00149 if (mInputStreams[i]->numAvail() >= mInputStreams[i]->numHeaders()) {
00150 locWasAny = true;
00151 locIsOK = locIsOK && true;
00152 } else {
00153 locIsOK = false;
00154 }
00155 }
00156 }
00157
00158 return locWasAny && locIsOK;
00159 }
00160
00161 void AnxPageInterleaver::letsGetFishy()
00162 {
00163
00164 unsigned long locSerialNo = 888;
00165
00166
00167 unsigned char* locUTC = new unsigned char[20];
00168 memset((void*)locUTC, 0, 20);
00169 OggPage* locFishHead = FishSkeleton::makeFishHeadBOS_3_0(locSerialNo, mVersionMajor, mVersionMinor, 0,0,0,0,locUTC);
00170
00171
00172 mFileWriter->acceptOggPage(locFishHead);
00173
00174
00175 for (size_t i = 0; i < mInputStreams.size(); i++) {
00176 if (mInputStreams[i]->isActive()) {
00177 mFileWriter->acceptOggPage(mInputStreams[i]->popFront());
00178 }
00179 }
00180
00181
00182 for (unsigned long i = 0; i < mParentFilter->GetPinCount() - 1; i++) {
00183 AnxMuxInputPin* locPin = (AnxMuxInputPin*)mParentFilter->GetPin(i);
00184 OggPage* locFishBonePage = FishSkeleton::makeFishBone_3_0_Page(locPin->mFishBonePacket, locSerialNo);
00185 mFileWriter->acceptOggPage(locFishBonePage);
00186 }
00187
00188
00189 for (size_t stream = 0; stream < mInputStreams.size(); stream++) {
00190 if (mInputStreams[stream]->isActive()) {
00191 for (unsigned long pack = 1; pack < mInputStreams[stream]->numHeaders(); pack++) {
00192 OggPage* locSecHead = mInputStreams[stream]->popFront();
00193 mFileWriter->acceptOggPage(locSecHead);
00194 }
00195 }
00196 }
00197
00198
00199 mFileWriter->acceptOggPage(FishSkeleton::makeFishEOS(locSerialNo));
00200
00201
00202
00203 }
00204 void AnxPageInterleaver::processData()
00205 {
00206 if ((mVersionMajor == 2) && (mVersionMinor == 0)) {
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 if (!mIsAnxSetup) {
00217 if (gotAllHeaders()) {
00218
00219 mIsAnxSetup = true;
00220 addAnnodex_2_0_BOS();
00221 addAllAnxData_2_0_BOS();
00222 addAnnodexEOS();
00223
00224 }
00225 } else {
00226 OggPageInterleaver::processData();
00227 }
00228 } else if ((mVersionMajor == 3) && (mVersionMinor == 0)) {
00229 if (!mIsAnxSetup) {
00230 if (gotAllSecondaryHeaders()) {
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 letsGetFishy();
00241
00242 mIsAnxSetup = true;
00243
00244
00245
00246
00247
00248
00249
00250 }
00251 } else {
00252 OggPageInterleaver::processData();
00253 }
00254
00255 } else {
00256 throw 0;
00257 }
00258 }