void WowzaUDPInput::run() { trace("begin run()"); configure(source, (void*)NULL); configure(encoder, (void*)NULL); if (FFMpeg_setVideoPreset((char*)"baseline") != FFMpeg_SUCCESS) { error("Error trying to set video preset as baseline."); throw IllegalParameterException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } if (FFMpeg_setOther((char*)"g", (char*)"60") != FFMpeg_SUCCESS) { error("Error trying to set property g as 60."); throw IllegalParameterException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } if (FFMpeg_setVideoBitrate((char*)"150000")!= FFMpeg_SUCCESS) { error("Error trying to set video bitrate as 150000."); throw IllegalParameterException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } if (FFMpeg_setFormat((char*)"mpegts") != FFMpeg_SUCCESS) { error("Error trying to set format as mpegts."); throw IllegalParameterException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } if (FFMpeg_setVideoBitstreamFilter((char*)"h264_mp4toannexb") != FFMpeg_SUCCESS) { error("Error trying to set video bitstream filter as h264_mp4toannexb."); throw IllegalParameterException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } string outputfile = "udp://" + ip + ":" + Functions::numberToString(port) + "?pkt_size=1316"; debug("UDP output file name: " + outputfile); if (FFMpeg_setOutputFile((char*) outputfile.c_str()) != FFMpeg_SUCCESS) { error("Error trying to set UDP output file: " + outputfile); throw IllegalParameterException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } if (FFMpeg_transcode() != FFMpeg_SUCCESS) { error("Error during transcode process."); throw TranscodingException( FFMpeg_getErrorStr(), CLASS_NAME, "run()"); } FFMpeg_reset(__LINE__); finished = true; Thread::unlockConditionSatisfied(); }
void XalanOutputStream::transcode( const XalanDOMChar* theBuffer, size_type theBufferLength, TranscodeVectorType& theDestination) { if (m_transcoder == 0) { if (TranscodeToLocalCodePage( theBuffer, theBufferLength, theDestination) == false) { if (m_throwTranscodeException == true) { XalanDOMString theBuffer(theDestination.getMemoryManager()); throw TranscodingException(theBuffer); } else { } } } else { bool fDone = false; // Keep track of the total bytes we've added to the // destination vector, and the total bytes we've // eaten from theBuffer. size_type theTotalBytesFilled = 0; size_type theTotalBytesEaten = 0; // Keep track of the current position in the input buffer, // and amount remaining in the buffer, since we may not be // able to transcode it all at once. const XalanDOMChar* theBufferPosition = theBuffer; size_type theRemainingBufferLength = theBufferLength; // Keep track of the destination size, and the target size, which is // the size of the destination that has not yet been filled with // transcoded characters. Double the buffer size, in case we're // transcoding to a 16-bit encoding. // $$$ ToDo: We need to know the size of an encoding, so we can // do the right thing with the destination size. size_type theDestinationSize = theBufferLength * 2; size_type theTargetSize = theDestinationSize; do { // Resize the buffer... theDestination.resize(theDestinationSize + 1); size_type theSourceBytesEaten = 0; size_type theTargetBytesEaten = 0; XalanTranscodingServices::eCode theResult = m_transcoder->transcode( theBufferPosition, theRemainingBufferLength, #if defined(XALAN_OLD_STYLE_CASTS) (XMLByte*)&theDestination[0] + theTotalBytesFilled, #else reinterpret_cast<XMLByte*>(&theDestination[0]) + theTotalBytesFilled, #endif theTargetSize, theSourceBytesEaten, theTargetBytesEaten); if(theResult != XalanTranscodingServices::OK) { if (m_throwTranscodeException == true) { XalanDOMString theBuffer(theDestination.getMemoryManager()); throw TranscodingException(theBuffer); } } theTotalBytesFilled += theTargetBytesEaten; theTotalBytesEaten += theSourceBytesEaten; if (theTotalBytesEaten == theBufferLength) { fDone = true; } else { assert(theTotalBytesEaten < theBufferLength); // Update everything... theBufferPosition += theSourceBytesEaten; theRemainingBufferLength -= theSourceBytesEaten; // The new target size will always be the // current destination size, since we // grow by a factor of 2. This will // need to change if the factor is // every changed. theTargetSize = theDestinationSize; // Grow the destination by a factor of // two 2. See the previous comment if // you want to change this. theDestinationSize = theDestinationSize * 2; } } while(fDone == false); // Resize things, if there are any extra bytes... if (theDestination.size() != theTotalBytesFilled) { theDestination.resize(theTotalBytesFilled); } } }