>>> >>>>>> > [wmav2 @ 0x106829e20] prev_block_len_bits N out of range
>>> >>>>>> > (where N is in the range 4..6).
>>> >>>>>>
>>> >>>>>> Do these errors occur when you're decoding only a single file,
>>> >>>>>> without
>>> >>>>>> threading?
>>> >>>>>
>>> >>>>> Yes they do, and on both platforms, though I've never seen them cause
>>> >>>>> a segfault when not parallelised. Also interspersed with those errors
>>> >>>>> are
>>> >>>>> [wmav2 @ 0x1030a9800] overflow in spectral RLE, ignoring
>>> >>>>> [wmav2 @ 0x1030a9800] frame_len overflow
>>> >>>>>
>>> >>>>> And very occasionally
>>> >>>>> [wmav2 @ 0x1030a9800] len -211 invalid
>>> >>>>>
>>> >>>>> Do these errors suggest anything in particular to you?
>>> >>>>
>>> >>>> Yes, is it possible you're not setting AVCodecContext->bit_rate,
>>> >>>> ->block_align, ->extradata or ->extradata_size?
>>> >>>
>>> >>> I had thought (based on what I'd read in the ffmpeg doxygen) that all
>>> >>> of those fields (certainly bit_rate, extra_data and extradata_size)
>>> >>> were set internally by libav for decoding, and only needed to be set
>>> >>> by the user for encoding?
>>> >>>
>>> >>> If I'm wrong, could you suggest what I should set them to, for a
>>> >>> general decoding solution? I'm seeing no examples online that set
>>> >>> them.
>>> >>
>>> >> They are set, but (in the case of WMA) by the demuxer instead of the
>>> >> decoder. My impression is you're not using the
>>> >> AVFormatContext->streams[%d]->codec for decoding, but rather create
>>> >> one independently. Then you need to copy the demuxer values to the
>>> >> decoder values. If you're using your own demuxer instead of
>>> >> libavformat's, see libavformat for how to read them.
>>> >>
>>> >
>>> > I'm doing something in the neighbourhood of this:
>>> >
>>> > AVCodecContext* cCtx = fCtx->streams[audioStream]->codec;
>>> > codec = avcodec_find_decoder(cCtx->codec_id);
>>> > if(codec == NULL){
>>> > throw Exception();
>>> > }
>>> > if(avcodec_open2(cCtx, codec, &opts) < 0){
>>> > throw Exception();
>>> > }
>>> >
>>> > And then passing that codec context into the decode job. So I think
>>> > that should be fine, no?
>>>
>>> Probably. Can a tool like avconv or avplay playback the file
>>> succesfully without throwing errors?
>>
>> Yes. Plays back with no errors at all.
>
> Can we see your full code? It's possible you're initializing the code
> at the wrong moment when these things aren't known yet...
Sure thing: https://github.com/ibsh/is_KeyFinder/blob/master/decoderlibav.cpp
Although the function at line 155 (which is probably the one you're
most interested) now does its memory management with av_malloc as
mentioned earlier in the thread, I just haven't merged that commit
yet:
int LibAvDecoder::decodePacket(AVCodecContext* cCtx, AVPacket* avpkt,
AudioStream* ab){
while(avpkt->size > 0){
int outputBufferSize = ((AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2) *
sizeof(int16_t);
int16_t* outputBuffer = (int16_t*)av_malloc(outputBufferSize);
int bytesConsumed = avcodec_decode_audio3(cCtx, outputBuffer,
&outputBufferSize, avpkt);
if(bytesConsumed <= 0){
avpkt->size = 0;
av_free(outputBuffer);
return 1;
}
int newSamplesDecoded = outputBufferSize / sizeof(int16_t);
int oldSampleCount = ab->getSampleCount();
try{
ab->addToSampleCount(newSamplesDecoded);
}catch(Exception& e){
av_free(outputBuffer);
throw e;
}
for(int i = 0; i < newSamplesDecoded; i++)
ab->setSample(oldSampleCount+i, (float)outputBuffer[i]);
if(bytesConsumed < avpkt->size){
size_t newLength = avpkt->size - bytesConsumed;
uint8_t* datacopy = avpkt->data;
avpkt->data = (uint8_t*)av_malloc(newLength);
memcpy(avpkt->data, datacopy + bytesConsumed, newLength);
av_free(datacopy);
}
avpkt->size -= bytesConsumed;
av_free(outputBuffer);
}
return 0;
}
Ibrahim
_______________________________________________
libav-api mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-api