void FFmpegVideoDecoder<LIBAV_VER>::ProcessDrain() { RefPtr<MediaRawData> empty(new MediaRawData()); empty->mTimecode = mLastInputDts; bool gotFrame = false; while (NS_SUCCEEDED(DoDecode(empty, &gotFrame)) && gotFrame); mCallback->DrainComplete(); }
void VorbisDataDecoder::Decode(MediaRawData* aSample) { if (DoDecode(aSample) == -1) { mCallback->Error(); } else if (mTaskQueue->IsEmpty()) { mCallback->InputExhausted(); } }
RefPtr<MediaDataDecoder::DecodePromise> FFmpegVideoDecoder<LIBAV_VER>::ProcessDrain() { RefPtr<MediaRawData> empty(new MediaRawData()); empty->mTimecode = mLastInputDts; bool gotFrame = false; DecodedData results; while (NS_SUCCEEDED(DoDecode(empty, &gotFrame, results)) && gotFrame) { } return DecodePromise::CreateAndResolve(Move(results), __func__); }
RefPtr<MediaDataDecoder::DecodePromise> FFmpegVideoDecoder<LIBAV_VER>::ProcessDecode(MediaRawData* aSample) { bool gotFrame = false; DecodedData results; MediaResult rv = DoDecode(aSample, &gotFrame, results); if (NS_FAILED(rv)) { return DecodePromise::CreateAndReject(rv, __func__); } return DecodePromise::CreateAndResolve(Move(results), __func__); }
MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample, bool* aGotFrame, MediaDataDecoder::DecodedData& aResults) { uint8_t* inputData = const_cast<uint8_t*>(aSample->Data()); size_t inputSize = aSample->Size(); #if LIBAVCODEC_VERSION_MAJOR >= 54 if (inputSize && mCodecParser && (mCodecID == AV_CODEC_ID_VP8 #if LIBAVCODEC_VERSION_MAJOR >= 55 || mCodecID == AV_CODEC_ID_VP9 #endif )) { while (inputSize) { uint8_t* data; int size; int len = mLib->av_parser_parse2( mCodecParser, mCodecContext, &data, &size, inputData, inputSize, aSample->mTime, aSample->mTimecode, aSample->mOffset); if (size_t(len) > inputSize) { return NS_ERROR_DOM_MEDIA_DECODE_ERR; } inputData += len; inputSize -= len; if (size) { bool gotFrame = false; MediaResult rv = DoDecode(aSample, data, size, &gotFrame, aResults); if (NS_FAILED(rv)) { return rv; } if (gotFrame && aGotFrame) { *aGotFrame = true; } } } return NS_OK; } #endif return DoDecode(aSample, inputData, inputSize, aGotFrame, aResults); }
nsresult AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { AssertOnTaskQueueThread(); if (mIsFlushing) { return NS_OK; } auto rv = DoDecode(aSample); return rv; }
void VorbisDataDecoder::ProcessDecode(MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); if (mIsFlushing) { return; } if (DoDecode(aSample) == -1) { mCallback->Error(); } else if (mTaskQueue->IsEmpty()) { mCallback->InputExhausted(); } }
void VorbisDataDecoder::ProcessDecode(MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); if (mIsFlushing) { return; } MediaResult rv = DoDecode(aSample); if (NS_FAILED(rv)) { mCallback->Error(rv); } else { mCallback->InputExhausted(); } }
void FFmpegDataDecoder<LIBAV_VER>::ProcessDecode(MediaRawData* aSample) { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); if (mIsFlushing) { return; } switch (DoDecode(aSample)) { case DecodeResult::DECODE_ERROR: mCallback->Error(MediaDataDecoderError::DECODE_ERROR); break; case DecodeResult::FATAL_ERROR: mCallback->Error(MediaDataDecoderError::FATAL_ERROR); break; default: if (mTaskQueue->IsEmpty()) { mCallback->InputExhausted(); } } }
void HandleByte(char d0) { ++SREC_COLUMN; if(d0=='S') { SREC_COLUMN=0; SREC_ADDR=0; SREC_BYTECOUNT=0; SREC_TYPE=0; } else { if(SREC_COLUMN==1) { int t; t=SREC_TYPE=DoDecode(SREC_TYPE,d0); // Called once, should result in type being in the lowest nybble bye of SREC_TYPE if(t>3) t=10-t; // Just to be awkward, S7 has 32-bit addr, S8 has 24 and S9 has 16! SREC_ADDRSIZE=(t+1)<<1; printf("SREC_TYPE: %d, SREC_ADDRSIZE: %d\n",SREC_TYPE,SREC_ADDRSIZE); Breadcrumb('t'); } else if((SREC_TYPE<=9)||(SREC_TYPE>0)) { if(SREC_COLUMN<=3) // Columns 2 and 3 contain byte count. { SREC_BYTECOUNT=DoDecode(SREC_BYTECOUNT,d0); printf("Bytecount: %x\n",SREC_BYTECOUNT); } else if(SREC_COLUMN<=(SREC_ADDRSIZE+3)) // Columns 4 to ... contain the address. { SREC_ADDR=DoDecode(SREC_ADDR,d0); // Called 2, 3 or 4 times, depending on the number of address bits. SREC_COUNTER=1; printf("SREC_ADDR: %x\n",SREC_ADDR); } else if(SREC_TYPE>0 && SREC_TYPE<=3) // Only types 1, 2 and 3 have data { if(SREC_COLUMN<=((SREC_BYTECOUNT<<1)+1)) // Two characters for each output byte { #ifdef DEBUG // unsigned char *p=&SREC_TEMP; #else // unsigned char *p=(unsigned char *)SREC_ADDR; #endif SREC_TEMP=DoDecode(SREC_TEMP,d0); --SREC_COUNTER; if(SREC_COUNTER<0) { printf("%x: %x\n",SREC_ADDR,SREC_TEMP&0xff); #ifndef DEBUG *(unsigned char *)SREC_ADDR=SREC_TEMP; #endif ++SREC_ADDR; SREC_COUNTER=1; } } else { #ifdef DEBUG // unsigned char *p=&SREC_TEMP; #else // unsigned char *p=(unsigned char *)SREC_ADDR; #endif if(SREC_COUNTER==0) { SREC_TEMP<<=4; #ifndef DEBUG *(unsigned char *)SREC_ADDR=SREC_TEMP; #endif // *p<<=4; } } } else if(SREC_TYPE>=7) { Breadcrumb('B'); printf("Booting to %x\n",SREC_ADDR); #ifdef DEBUG exit(0); #else _boot(); #endif } } } }
MediaResult FFmpegVideoDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample) { bool gotFrame = false; return DoDecode(aSample, &gotFrame); }