Michael Riepe wrote:
...
> That breaks the build with local ffmpeg.
I didn't try that, my oops.
...
> Not actually necessary.
Agreed, they are only warnings. When compiling, it seems to me to be
cleaner to not have warnings being output - and people wondering whether
it is something going wrong. IMHO, in terms of portability it forces the
compiler to do the evaluation correctly even if a particular compiler's
operator precedence differed from the compiler that is currently used.
eg: a compiler that interprets:
buf[5] = (mm<<4) & 0xf0 | (ss>>3) & 0x07 | 0x08;
as:
buf[5] = (mm<<4) & (0xf0 | (ss>>3)) & (0x07 | 0x08);
I have no idea if such a thing exists ;)
>> Index: src/lavfmuxer.cpp
>> ===================================================================
>> --- src/lavfmuxer.cpp (revision 116)
>> +++ src/lavfmuxer.cpp (working copy)
>> @@ -89,7 +89,7 @@
>> int16_t samples[6*1536]; // must be enough for 6 AC-3 channels --mr
>> int frame_size=sizeof(samples);
>> //fprintf(stderr, "** decode audio size=%d\n", sd->inbytes());
>> - avcodec_decode_audio(s->codec,samples,&frame_size,
>> + avcodec_decode_audio2(s->codec,samples,&frame_size,
>> (uint8_t*) sd->getdata(),sd->inbytes());
>> avcodec_close(s->codec);
>> }
>
> avcodec_decode_audio2 doesn't exist in the local version of ffmpeg.
>
> What's the difference, by the way?
In current ffmpeg {ffmpeg-0.4.9-0.44.20080113.lvn9}, various functions
have been deprecated {both avcodec_decode_audio and img_copy}.
I notice that it was 2005 {according to the source} when ffmpeg was
taken internally. How much work would it be to rebase the internal one
to current ffmpeg svn ?
I might be putting my hand up to do it - based on the customizations the
internal ffmpeg has to reduce it's size.
Or would you prefer to wait until ffmpeg actually removes that function
{they don't seem to give a timeframe} ?
Even then it wouldn't strictly be necessary due to the internally
included version, but would make it difficult for external packagers to
build using system ffmpeg. {Also, a 500k dvbcut {plus libs} v a 2500k
dvbcut, and any ffmpeg security/ crash issues applied more easily}.
For decode audio the function prototypes are the same:
==== from current avcodec.h:
/**
* @deprecated Use avcodec_decode_audio2() instead.
*/
attribute_deprecated int avcodec_decode_audio(AVCodecContext *avctx,
int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size);
/**
* Decodes an audio frame from \p buf into \p samples.
* The avcodec_decode_audio2() function decodes an audio frame from the
input
* buffer \p buf of size \p buf_size. To decode it, it makes use of the
* audio codec which was coupled with \p avctx using avcodec_open(). The
* resulting decoded frame is stored in output buffer \p samples. If
no frame
* could be decompressed, \p frame_size_ptr is zero. Otherwise, it is the
* decompressed frame size in \e bytes.
*
* @warning You \e must set \p frame_size_ptr to the allocated size of the
* output buffer before calling avcodec_decode_audio2().
*
* @warning The input buffer must be \c FF_INPUT_BUFFER_PADDING_SIZE
larger than
* the actual read bytes because some optimized bitstream readers read
32 or 64
* bits at once and could read over the end.
*
* @warning The end of the input buffer \p buf should be set to 0 to
ensure that
* no overreading happens for damaged MPEG streams.
*
* @note You might have to align the input buffer \p buf and output
buffer \p
* samples. The alignment requirements depend on the CPU: On some CPUs
it isn't
* necessary at all, on others it won't work at all if not aligned and
on others
* it will work but it will have an impact on performance. In practice, the
* bitstream should have 4 byte alignment at minimum and all sample
data should
* be 16 byte aligned unless the CPU doesn't need it (AltiVec and SSE
do). If
* the linesize is not a multiple of 16 then there's no sense in
aligning the
* start of the buffer to 16.
*
* @param avctx the codec context
* @param[out] samples the output buffer
* @param[in,out] frame_size_ptr the output buffer size in bytes
* @param[in] buf the input buffer
* @param[in] buf_size the input buffer size in bytes
* @return On error a negative value is returned, otherwise the number
of bytes
* used or zero if no frame could be decompressed.
*/
int avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size);
====
From included avcodec.h:
int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size);
=====
The actual code is in avcodec/utils.c: {for current ffmpeg}
int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx,
int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size)
{
int ret;
if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
//FIXME remove the check below _after_ ensuring that all audio
check that the available space is enough
if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){
av_log(avctx, AV_LOG_ERROR, "buffer smaller than
AVCODEC_MAX_AUDIO_FRAME_SIZE\n");
return -1;
}
if(*frame_size_ptr < FF_MIN_BUFFER_SIZE ||
*frame_size_ptr < avctx->channels * avctx->frame_size *
sizeof(int16_t)){
av_log(avctx, AV_LOG_ERROR, "buffer %d too small\n",
*frame_size_ptr);
return -1;
}
ret = avctx->codec->decode(avctx, samples, frame_size_ptr,
buf, buf_size);
avctx->frame_number++;
}else{
ret= 0;
*frame_size_ptr=0;
}
return ret;
}
#if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size){
*frame_size_ptr= AVCODEC_MAX_AUDIO_FRAME_SIZE;
return avcodec_decode_audio2(avctx, samples, frame_size_ptr, buf,
buf_size);
}
#endif
=====
The older code is in avcodec/utils.c: {for included ffmpeg}
/* decode an audio frame. return -1 if error, otherwise return the
*number of bytes used. If no frame could be decompressed,
*frame_size_ptr is zero. Otherwise, it is the decompressed frame
*size in BYTES. */
int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples,
int *frame_size_ptr,
uint8_t *buf, int buf_size)
{
int ret;
*frame_size_ptr= 0;
if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
ret = avctx->codec->decode(avctx, samples, frame_size_ptr,
buf, buf_size);
avctx->frame_number++;
}else
ret= 0;
return ret;
}
=====
So there appears to be some extra checking to make sure that things
don't go wrong. Since the _2 version isn't in the included ffmpeg, then
we couldn't directly apply without moving to a newer ffmpeg.
...
> Not necessary either.
Agreed. Not worth making a release for, but perhaps when the next
serious patches come along.
+#include <cstring>
> I suppose this is for memcpy?
Yes. This is the one that actually allows it to compile.
Thanks for your time in perusing these patches.
DaveT.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
DVBCUT-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dvbcut-user