00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "H264VideoStreamDiscreteFramer.hh"
00025
00026 H264VideoStreamDiscreteFramer*
00027 H264VideoStreamDiscreteFramer::createNew(UsageEnvironment& env, FramedSource* inputSource) {
00028
00029 return new H264VideoStreamDiscreteFramer(env, inputSource);
00030 }
00031
00032 H264VideoStreamDiscreteFramer
00033 ::H264VideoStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource)
00034 : H264VideoStreamFramer(env, inputSource, False, False) {
00035 }
00036
00037 H264VideoStreamDiscreteFramer::~H264VideoStreamDiscreteFramer() {
00038 }
00039
00040 void H264VideoStreamDiscreteFramer::doGetNextFrame() {
00041
00042
00043
00044 fInputSource->getNextFrame(fTo, fMaxSize,
00045 afterGettingFrame, this,
00046 FramedSource::handleClosure, this);
00047 }
00048
00049 void H264VideoStreamDiscreteFramer
00050 ::afterGettingFrame(void* clientData, unsigned frameSize,
00051 unsigned numTruncatedBytes,
00052 struct timeval presentationTime,
00053 unsigned durationInMicroseconds) {
00054 H264VideoStreamDiscreteFramer* source = (H264VideoStreamDiscreteFramer*)clientData;
00055 source->afterGettingFrame1(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds);
00056 }
00057
00058 void H264VideoStreamDiscreteFramer
00059 ::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes,
00060 struct timeval presentationTime,
00061 unsigned durationInMicroseconds) {
00062
00063 u_int8_t nal_unit_type = frameSize == 0 ? 0xFF : fTo[0]&0x1F;
00064
00065
00066
00067
00068 if (nal_unit_type == 0) {
00069 if (frameSize >= 4 && fTo[0] == 0 && fTo[1] == 0 && ((fTo[2] == 0 && fTo[3] == 1) || fTo[2] == 1)) {
00070 envir() << "H264VideoStreamDiscreteFramer error: MPEG 'start code' seen in the input\n";
00071 } else {
00072 envir() << "Warning: Invalid 'nal_unit_type': 0\n";
00073 }
00074 } else if (nal_unit_type == 7) {
00075 saveCopyOfSPS(fTo, frameSize);
00076 } else if (nal_unit_type == 8) {
00077 saveCopyOfPPS(fTo, frameSize);
00078 }
00079
00080
00081
00082
00083 Boolean const isVCL = nal_unit_type <= 5 && nal_unit_type > 0;
00084 if (isVCL) fPictureEndMarker = True;
00085
00086
00087 fFrameSize = frameSize;
00088 fNumTruncatedBytes = numTruncatedBytes;
00089 fPresentationTime = presentationTime;
00090 fDurationInMicroseconds = durationInMicroseconds;
00091 afterGetting(this);
00092 }