00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JPEGVideoRTPSink.hh"
00022 #include "JPEGVideoSource.hh"
00023
00024 JPEGVideoRTPSink
00025 ::JPEGVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs)
00026 : VideoRTPSink(env, RTPgs, 26, 90000, "JPEG") {
00027 }
00028
00029 JPEGVideoRTPSink::~JPEGVideoRTPSink() {
00030 }
00031
00032 JPEGVideoRTPSink*
00033 JPEGVideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs) {
00034 return new JPEGVideoRTPSink(env, RTPgs);
00035 }
00036
00037 Boolean JPEGVideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) {
00038 return source.isJPEGVideoSource();
00039 }
00040
00041 Boolean JPEGVideoRTPSink
00042 ::frameCanAppearAfterPacketStart(unsigned char const* ,
00043 unsigned ) const {
00044
00045 return False;
00046 }
00047
00048 void JPEGVideoRTPSink
00049 ::doSpecialFrameHandling(unsigned fragmentationOffset,
00050 unsigned char* ,
00051 unsigned ,
00052 struct timeval frameTimestamp,
00053 unsigned numRemainingBytes) {
00054
00055 JPEGVideoSource* source = (JPEGVideoSource*)fSource;
00056
00057 u_int8_t mainJPEGHeader[8];
00058
00059 mainJPEGHeader[0] = 0;
00060 mainJPEGHeader[1] = fragmentationOffset >> 16;
00061 mainJPEGHeader[2] = fragmentationOffset >> 8;
00062 mainJPEGHeader[3] = fragmentationOffset;
00063 mainJPEGHeader[4] = source->type();
00064 mainJPEGHeader[5] = source->qFactor();
00065 mainJPEGHeader[6] = source->width();
00066 mainJPEGHeader[7] = source->height();
00067 setSpecialHeaderBytes(mainJPEGHeader, sizeof mainJPEGHeader);
00068
00069 if (fragmentationOffset == 0 && source->qFactor() >= 128) {
00070
00071 u_int8_t precision;
00072 u_int16_t length;
00073 u_int8_t const* quantizationTables
00074 = source->quantizationTables(precision, length);
00075
00076 unsigned const quantizationHeaderSize = 4 + length;
00077 u_int8_t* quantizationHeader = new u_int8_t[quantizationHeaderSize];
00078
00079 quantizationHeader[0] = 0;
00080 quantizationHeader[1] = precision;
00081 quantizationHeader[2] = length >> 8;
00082 quantizationHeader[3] = length&0xFF;
00083 if (quantizationTables != NULL) {
00084 for (u_int16_t i = 0; i < length; ++i) {
00085 quantizationHeader[4+i] = quantizationTables[i];
00086 }
00087 }
00088
00089 setSpecialHeaderBytes(quantizationHeader, quantizationHeaderSize,
00090 sizeof mainJPEGHeader );
00091 delete[] quantizationHeader;
00092 }
00093
00094 if (numRemainingBytes == 0) {
00095
00096
00097 setMarkerBit();
00098 }
00099
00100
00101 setTimestamp(frameTimestamp);
00102 }
00103
00104
00105 unsigned JPEGVideoRTPSink::specialHeaderSize() const {
00106
00107 JPEGVideoSource* source = (JPEGVideoSource*)fSource;
00108
00109 unsigned headerSize = 8;
00110
00111 if (curFragmentationOffset() == 0 && source->qFactor() >= 128) {
00112
00113 u_int8_t dummy;
00114 u_int16_t quantizationTablesSize;
00115 (void)(source->quantizationTables(dummy, quantizationTablesSize));
00116
00117 headerSize += 4 + quantizationTablesSize;
00118 }
00119
00120
00121
00122 return headerSize;
00123 }