1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
/**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
**********/
// "liveMedia"
// Copyright (c) 1996-2004 Live Networks, Inc. All rights reserved.
// A HTTP Sink specifically for MPEG Video
// Implementation
#include "MPEG1or2VideoHTTPSink.hh"
////////// MPEG1or2VideoHTTPSink //////////
MPEG1or2VideoHTTPSink* MPEG1or2VideoHTTPSink::createNew(UsageEnvironment& env, Port ourPort) {
int ourSocket = -1;
MPEG1or2VideoHTTPSink* newSink = NULL;
do {
int ourSocket = setUpOurSocket(env, ourPort);
if (ourSocket == -1) break;
MPEG1or2VideoHTTPSink* newSink = new MPEG1or2VideoHTTPSink(env, ourSocket);
if (newSink == NULL) break;
appendPortNum(env, ourPort);
return newSink;
} while (0);
if (ourSocket != -1) ::_close(ourSocket);
delete newSink;
return NULL;
}
MPEG1or2VideoHTTPSink::MPEG1or2VideoHTTPSink(UsageEnvironment& env, int ourSocket)
: HTTPSink(env, ourSocket), fHaveSeenFirstVSH(False) {
}
MPEG1or2VideoHTTPSink::~MPEG1or2VideoHTTPSink() {
}
#define VIDEO_SEQUENCE_HEADER_START_CODE 0x000001B3
Boolean MPEG1or2VideoHTTPSink::isUseableFrame(unsigned char* framePtr,
unsigned frameSize) {
// Some clients get confused if the data we give them does not start
// with a 'video_sequence_header', so we ignore any frames that precede
// the first 'video_sequence_header':
// Sanity check: a frame with < 4 bytes is never valid:
if (frameSize < 4) return False;
if (fHaveSeenFirstVSH) return True;
unsigned first4Bytes
= (framePtr[0]<<24)|(framePtr[1]<<16)|(framePtr[2]<<8)|framePtr[3];
if (first4Bytes == VIDEO_SEQUENCE_HEADER_START_CODE) {
fHaveSeenFirstVSH = True;
return True;
} else {
return False;
}
}
|