[packages/avifile] - more (dirty) ffmpeg updates

qboosh qboosh at pld-linux.org
Sun Dec 1 21:25:23 CET 2024


commit 8d8c14a7b47f3ec3497d7e6175045960b68664cc
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sun Dec 1 21:16:30 2024 +0100

    - more (dirty) ffmpeg updates

 avifile-ffmpeg.patch | 560 +++++++++++++++++++++++++++++++++++++++++++++++++++
 avifile.spec         |  30 +--
 2 files changed, 578 insertions(+), 12 deletions(-)
---
diff --git a/avifile.spec b/avifile.spec
index 886e85c..b467cd8 100644
--- a/avifile.spec
+++ b/avifile.spec
@@ -1,9 +1,10 @@
 #
 # Conditional build:
-%bcond_without	qt	# Qt-based utilities (incl. aviplay)
-%bcond_with	divx	# divx4linux support (proprietary, binary-only lib); if disabled, divx is decoded by ffmpeg
-%bcond_with	nas	# NAS support
-%bcond_with	v4l1	# Video4Linux 1
+%bcond_without	qt		# Qt-based utilities (incl. aviplay)
+%bcond_with	divx		# divx4linux support (proprietary, binary-only lib); if disabled, divx is decoded by ffmpeg
+%bcond_with	nas		# NAS support
+%bcond_without	system_ffmpeg	# system FFmpeg libraries
+%bcond_with	v4l1		# Video4Linux 1
 #
 Summary:	Library for playing AVI files
 Summary(pl.UTF-8):	Biblioteka do odtwarzania plików AVI
@@ -12,7 +13,8 @@ Name:		avifile
 Version:	0.7.45
 Release:	18
 Epoch:		3
-License:	GPL
+# referred as just "GPL" in most places, player/playercontrol.cpp specifies version 2
+License:	GPL v2
 Group:		X11/Libraries
 Source0:	https://downloads.sourceforge.net/avifile/%{name}-0.7-%{version}.tar.bz2
 # Source0-md5:	7da94802f120d1b69e04a13170dcd21d
@@ -50,7 +52,9 @@ BuildRequires:	autoconf
 BuildRequires:	automake
 %{?with_divx:BuildRequires:	divx4linux-devel}
 BuildRequires:	faad2-devel
-BuildRequires:	ffmpeg-devel
+%if %{with system_ffmpeg}
+BuildRequires:	ffmpeg-devel >= 4
+%endif
 %ifarch ppc
 # version with altivec support fixed
 BuildRequires:	gcc >= 5:3.3.2-3
@@ -345,7 +349,6 @@ Sterownik VIDIX dla kart graficznych ATI Rage128.
 
 %prep
 %setup -q -n %{name}-0.7-%{version}
-%{__rm} -r ffmpeg m4/ffmpeg.m4
 %patch0 -p1
 %patch2 -p1
 %patch3 -p1
@@ -353,7 +356,6 @@ Sterownik VIDIX dla kart graficznych ATI Rage128.
 %patch5 -p1
 %patch6 -p1
 %patch7 -p1
-%patch8 -p1
 %patch9 -p1
 %patch10 -p1
 %patch11 -p1
@@ -361,16 +363,20 @@ Sterownik VIDIX dla kart graficznych ATI Rage128.
 %patch13 -p1
 %patch14 -p1
 %patch15 -p1
-%patch16 -p1
 %patch17 -p1
-%patch18 -p1
-%patch19 -p1
 %patch20 -p1
 %patch21 -p1
-%patch22 -p1
 %patch23 -p1
 %patch24 -p1
 %patch25 -p1
+%if %{with system_ffmpeg}
+%patch8 -p1
+%patch16 -p1
+%patch18 -p1
+%patch19 -p1
+%patch22 -p1
+%{__rm} -r ffmpeg m4/ffmpeg.m4
+%endif
 
 # unwanted hack
 %{__rm} m4/as.m4
diff --git a/avifile-ffmpeg.patch b/avifile-ffmpeg.patch
index 7aaa21a..84db0e1 100644
--- a/avifile-ffmpeg.patch
+++ b/avifile-ffmpeg.patch
@@ -709,3 +709,563 @@
      if (is_keyframe) {
  	*is_keyframe = m_pAvContext->coded_frame->key_frame ? 16 : 0;
  	//printf("KEYFRAME %d\n", *is_keyframe);
+--- avifile-0.7-0.7.45/lib/aviread/FFReadHandler.cpp.orig	2024-11-24 20:24:48.824416574 +0100
++++ avifile-0.7-0.7.45/lib/aviread/FFReadHandler.cpp	2024-11-24 21:56:00.031443168 +0100
+@@ -7,6 +7,7 @@
+ #define uint64_t_C(c)    (c ## ULL)
+ #endif
+ extern "C" {
++#include "avcodec.h"
+ #include "avformat.h"
+ }
+ 
+@@ -24,7 +25,6 @@ FFReadHandler::FFReadHandler()
+ {
+     if (!g_iInitilized)
+     {
+-	av_register_all();
+         g_iInitilized++;
+     }
+ }
+@@ -66,10 +66,10 @@ int FFReadHandler::Init(const char* url)
+     m_Streams.resize(m_pContext->nb_streams);
+     for (int i = 0; i < m_pContext->nb_streams; i++)
+     {
+-	AVCodecContext* avc = m_pContext->streams[i]->codec;
+-	AVM_WRITE("FF reader", "S: %d id:%x  bitrate:%d (%d) samprate:%d  chn:%d  framerate:%d/%d  wxh %dx%d  %d/%d\n",
+-		  i, avc->codec_id, avc->bit_rate, avc->bit_rate_tolerance,
+-		  avc->sample_rate, avc->channels, avc->time_base.num, avc->time_base.den,
++	const struct AVCodecParameters* avc = m_pContext->streams[i]->codecpar;
++	AVM_WRITE("FF reader", "S: %d id:%x  bitrate:%d samprate:%d  chn:%d  wxh %dx%d  %d/%d\n",
++		  i, avc->codec_id, avc->bit_rate,
++		  avc->sample_rate, avc->channels,
+ 		  avc->width, avc->height, avc->sample_aspect_ratio.num, avc->sample_aspect_ratio.den);
+ 	m_Streams[i] = new FFReadStream(this, i, m_pContext->streams[i]);
+     }
+@@ -105,7 +105,7 @@ IMediaReadStream* FFReadHandler::GetStre
+ 
+     for (int i = 0; i < m_pContext->nb_streams; i++)
+     {
+-	if (m_pContext->streams[i]->codec->codec_type == t)
++	if (m_pContext->streams[i]->codecpar->codec_type == t)
+ 	{
+ 	    if (j == stream_id)
+ 		return m_Streams[i];
+@@ -129,7 +129,7 @@ uint_t FFReadHandler::GetStreamCount(ISt
+     }
+ 
+     for (int i = 0; i < m_pContext->nb_streams; i++)
+-	if (m_pContext->streams[i]->codec->codec_type == t)
++	if (m_pContext->streams[i]->codecpar->codec_type == t)
+             j++;
+     return j;
+ }
+@@ -175,8 +175,19 @@ int FFReadHandler::readPacket()
+ 	AVFrame pic;
+ 	int got_pic = 0;
+ 	memset(&pic, 0, sizeof(pic));
+-	int r = avcodec_decode_video2(s->m_pAvContext,
+-				     &pic, &got_pic, &pkt);
++	int r = 0;
++	if (s->m_pAvContext->codec_type == AVMEDIA_TYPE_VIDEO || s->m_pAvContext->codec_type == AVMEDIA_TYPE_AUDIO) {
++	  r = avcodec_send_packet(s->m_pAvContext, &pkt);
++	  if (r < 0 && r != AVERROR(EAGAIN) && r != AVERROR_EOF)
++	    ; // error
++	  else {
++	    if (r >= 0)
++	      pkt.size = 0;
++	    r = avcodec_receive_frame(s->m_pAvContext, &pic);
++	    if (r >= 0)
++	      got_pic = 1;
++	  }
++	}
+ 	AVM_WRITE("FF reader", "____  %d   %d\n", r, got_pic);
+     }
+     //printf("FFMPEG pktsize: %u %llu   %d\n", pkt.size, pkt.pts, pkt.stream_index);fflush(stdout);
+@@ -205,12 +221,12 @@ int FFReadHandler::readPacket()
+     //else printf("Bitrate  %d\n", st->codec.bit_rate);
+     //printf("TIMESTAMP %lld    %d %d   bitrate:%d\n", p->timestamp, s->m_pAvStream->r_frame_rate_base, s->m_pAvStream->r_frame_rate, st->codec.bit_rate);
+ 
+-    switch (st->codec->codec_type)
++    switch (st->codecpar->codec_type)
+     {
+     case AVMEDIA_TYPE_AUDIO:
+-	if (!pkt.pts && st->codec->bit_rate)
++	if (!pkt.pts && st->codecpar->bit_rate)
+ 	    p->timestamp = (int64_t)p->position * 8 * 1000000 /
+-		st->codec->bit_rate;
++		st->codecpar->bit_rate;
+ 	s->m_uiPosition += pkt.size;
+ 	break;
+     case AVMEDIA_TYPE_VIDEO:
+@@ -227,7 +243,7 @@ int FFReadHandler::readPacket()
+ #endif
+     if (pkt.flags & AV_PKT_FLAG_KEY)
+ 	p->flags |= KEYFRAME;
+-    av_free_packet(&pkt);
++    av_packet_unref(&pkt);
+ 
+     if (s->m_Packets.size() >= s->m_Packets.capacity() - 1)
+     {
+--- avifile-0.7-0.7.45/lib/aviread/FFReadStream.cpp.orig	2024-11-24 20:24:48.824416574 +0100
++++ avifile-0.7-0.7.45/lib/aviread/FFReadStream.cpp	2024-11-25 20:16:14.319134916 +0100
+@@ -8,6 +8,7 @@
+ #define uint64_t_C(c)    (c ## ULL)
+ #endif
+ extern "C" {
++#include "avcodec.h"
+ #include "avformat.h"
+ }
+ 
+@@ -51,16 +52,15 @@ FFReadStream::FFReadStream(FFReadHandler
+ 	      m_pHandler->m_pContext->start_time, m_pHandler->m_pContext->duration);
+     m_dLength = m_pHandler->m_pContext->duration / (double) AV_TIME_BASE;
+     //printf("CODECRA %d  %d   %d\n", avs->codec.frame_rate, avs->codec->frame_rate_base, m_pAvStream->r_frame_rate_base);
+-    if (0 && avs->codec->codec_id == AV_CODEC_ID_MPEG1VIDEO)
++    if (0 && avs->codecpar->codec_id == AV_CODEC_ID_MPEG1VIDEO)
+     {
+ 	m_pAvContext = avcodec_alloc_context3(NULL);
+ 	//AVCodec* codec = avcodec_find_encoder(avs->codec->codec_id);
+ 	if (m_pAvContext)
+ 	{
+-	    AVCodec* codec = avcodec_find_decoder(avs->codec->codec_id);
++	    const AVCodec* codec = avcodec_find_decoder(avs->codecpar->codec_id);
+ 	    if (codec && avcodec_open2(m_pAvContext, codec, NULL) == 0)
+ 	    {
+-		m_pAvContext->flags |= AV_CODEC_FLAG_TRUNCATED;
+ 		m_pAvContext->skip_idct = m_pAvContext->skip_frame = AVDISCARD_ALL;
+ 		//printf("Opened hurryup decoder %p  %p\n", codec, m_pAvContext->codec->decode);
+ 	    }
+@@ -146,29 +146,29 @@ StreamInfo* FFReadStream::GetStreamInfo(
+ 	m_StreamInfo.m_p->m_iQuality = 0;
+ 	m_StreamInfo.m_p->m_iSampleSize = 1;//m_Header.dwSampleSize;
+ 
+-	switch (avs->codec->codec_type)
++	switch (avs->codecpar->codec_type)
+ 	{
+ 	case AVMEDIA_TYPE_AUDIO:
+-	    m_StreamInfo.m_p->setAudio(avs->codec->channels,
+-				       avs->codec->sample_rate,
+-				       avs->codec->frame_bits);
++	    m_StreamInfo.m_p->setAudio(avs->codecpar->channels,
++				       avs->codecpar->sample_rate,
++				       avs->codecpar->bits_per_raw_sample);
+ 	    m_StreamInfo.m_p->m_Type = StreamInfo::Audio;
+-	    m_StreamInfo.m_p->m_uiFormat = avs->codec->codec_tag;
++	    m_StreamInfo.m_p->m_uiFormat = avs->codecpar->codec_tag;
+ 	    AVM_WRITE("FF stream", "Audio Format:  %.4s (0x%x)\n",
+-		      (const char*)&avs->codec->codec_tag, avs->codec->codec_tag);
++		      (const char*)&avs->codecpar->codec_tag, avs->codecpar->codec_tag);
+ 	    break;
+ 	case AVMEDIA_TYPE_VIDEO:
+-	    m_StreamInfo.m_p->setVideo(avs->codec->width, avs->codec->height,
+-				       0, avs->codec->sample_aspect_ratio.num /
+-				       (float) avs->codec->sample_aspect_ratio.den);
++	    m_StreamInfo.m_p->setVideo(avs->codecpar->width, avs->codecpar->height,
++				       0, avs->codecpar->sample_aspect_ratio.num /
++				       (float) avs->codecpar->sample_aspect_ratio.den);
+ 	    m_StreamInfo.m_p->m_Type = StreamInfo::Video;
+-	    m_StreamInfo.m_p->m_uiFormat = avs->codec->codec_tag;
++	    m_StreamInfo.m_p->m_uiFormat = avs->codecpar->codec_tag;
+ 	    break;
+ 	default:
+             return 0;
+ 	}
+ 	if (m_StreamInfo.m_p->m_uiFormat == 0)
+-            m_StreamInfo.m_p->m_uiFormat = get_fcc(avs->codec->codec_id);
++            m_StreamInfo.m_p->m_uiFormat = get_fcc(avs->codecpar->codec_id);
+     }
+ 
+     return new StreamInfo(m_StreamInfo);
+@@ -189,7 +189,7 @@ uint_t FFReadStream::GetSampleSize() con
+ 
+ IStream::StreamType FFReadStream::GetType() const
+ {
+-    switch (m_pHandler->m_pContext->streams[m_uiSId]->codec->codec_type)
++    switch (m_pHandler->m_pContext->streams[m_uiSId]->codecpar->codec_type)
+     {
+     case AVMEDIA_TYPE_AUDIO: return IStream::Audio;
+     case AVMEDIA_TYPE_VIDEO: return IStream::Video;
+@@ -200,34 +200,34 @@ IStream::StreamType FFReadStream::GetTyp
+ uint_t FFReadStream::GetFormat(void *pFormat, uint_t lSize) const
+ {
+     AVStream* avs = m_pHandler->m_pContext->streams[m_uiSId];
+-    switch (avs->codec->codec_type)
++    switch (avs->codecpar->codec_type)
+     {
+     case AVMEDIA_TYPE_AUDIO:
+ 	if (pFormat && lSize >= sizeof(WAVEFORMATEX))
+ 	{
+ 	    WAVEFORMATEX* wf = (WAVEFORMATEX*) pFormat;
+-	    wf->wFormatTag = avs->codec->codec_tag;
++	    wf->wFormatTag = avs->codecpar->codec_tag;
+ 	    if (wf->wFormatTag == 0)
+-                wf->wFormatTag = get_fcc(avs->codec->codec_id);
++                wf->wFormatTag = get_fcc(avs->codecpar->codec_id);
+ 	    //if (avs->codec->codec_tag == 0) wf->wFormatTag = av_codec_get_fourcc(avs->codec->codec_id);
+ 	    //printf("CODEC  %x   %x   %x\n", wf->wFormatTag, avs->codec->codec_id, avs->codec->codec_tag);
+-	    wf->nChannels = avs->codec->channels;
+-	    wf->nSamplesPerSec = avs->codec->sample_rate;
+-	    wf->nAvgBytesPerSec = avs->codec->bit_rate / 8;
+-            wf->nBlockAlign = avs->codec->block_align;
+-	    wf->wBitsPerSample = avs->codec->bits_per_coded_sample;
+-	    if (lSize >= (sizeof(WAVEFORMATEX) + avs->codec->extradata_size)
+-		&& avs->codec->extradata)
++	    wf->nChannels = avs->codecpar->channels;
++	    wf->nSamplesPerSec = avs->codecpar->sample_rate;
++	    wf->nAvgBytesPerSec = avs->codecpar->bit_rate / 8;
++            wf->nBlockAlign = avs->codecpar->block_align;
++	    wf->wBitsPerSample = avs->codecpar->bits_per_coded_sample;
++	    if (lSize >= (sizeof(WAVEFORMATEX) + avs->codecpar->extradata_size)
++		&& avs->codecpar->extradata)
+ 	    {
+-		wf->cbSize = avs->codec->extradata_size;
+-		memcpy(wf + 1, avs->codec->extradata, avs->codec->extradata_size);
++		wf->cbSize = avs->codecpar->extradata_size;
++		memcpy(wf + 1, avs->codecpar->extradata, avs->codecpar->extradata_size);
+ 	    }
+ 	    else
+                 wf->cbSize = 0;
+ 	}
+ 	//printf("EEEEEEEEEEE %d\n", avs->codec->extradata_size);
+ 	return sizeof(WAVEFORMATEX)
+-	    + ((avs->codec->extradata) ? avs->codec->extradata_size : 0);
++	    + ((avs->codecpar->extradata) ? avs->codecpar->extradata_size : 0);
+     case AVMEDIA_TYPE_VIDEO:
+ 	if (pFormat && lSize >= sizeof(BITMAPINFOHEADER))
+ 	{
+@@ -235,27 +235,27 @@ uint_t FFReadStream::GetFormat(void *pFo
+ 	    //printf("FORMAT %p  %d   %d\n", pFormat, m_uiSId, avc->width);
+ 	    memset(bh, 0, sizeof(BITMAPINFOHEADER));
+ 	    bh->biSize = sizeof(BITMAPINFOHEADER);
+-	    bh->biWidth = avs->codec->width;
+-	    bh->biHeight = avs->codec->height;
++	    bh->biWidth = avs->codecpar->width;
++	    bh->biHeight = avs->codecpar->height;
+ 	    bh->biPlanes = 1;
+-	    bh->biCompression = avs->codec->codec_tag;
+-            bh->biBitCount = avs->codec->bits_per_coded_sample;
++	    bh->biCompression = avs->codecpar->codec_tag;
++            bh->biBitCount = avs->codecpar->bits_per_coded_sample;
+             // hack which might be eventually usefull
+ 	    memcpy(&bh->biXPelsPerMeter, &m_pHandler->m_pContext, sizeof(void*));
+ 	    if (bh->biCompression == 0)
+-		bh->biCompression = get_fcc(avs->codec->codec_id);
+-	    if (lSize >= (sizeof(BITMAPINFOHEADER) + avs->codec->extradata_size)
+-		&& avs->codec->extradata)
++		bh->biCompression = get_fcc(avs->codecpar->codec_id);
++	    if (lSize >= (sizeof(BITMAPINFOHEADER) + avs->codecpar->extradata_size)
++		&& avs->codecpar->extradata)
+ 	    {
+-		bh->biSize += avs->codec->extradata_size;
+-		memcpy(bh + 1, avs->codec->extradata, avs->codec->extradata_size);
++		bh->biSize += avs->codecpar->extradata_size;
++		memcpy(bh + 1, avs->codecpar->extradata, avs->codecpar->extradata_size);
+ 		//printf("COPY EXTRA %d\n", avs->extradata_size);
+ 		//for (unsigned i = 0; i < lSize; i++) printf("%d  0x%x\n", i, ((uint8_t*)pFormat)[i]);
+ 	    }
+ 	    //BitmapInfo(*bh).Print();
+ 	}
+ 	return sizeof(BITMAPINFOHEADER)
+-	    + ((avs->codec->extradata) ? avs->codec->extradata_size : 0);
++	    + ((avs->codecpar->extradata) ? avs->codecpar->extradata_size : 0);
+     default:
+ 	return 0;
+     }
+@@ -312,7 +312,7 @@ int FFReadStream::SeekTime(double time)
+ {
+     if (time < 1.)
+     {
+-	if (m_pAvStream->codec->codec_type == AVMEDIA_TYPE_AUDIO)
++	if (m_pAvStream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
+             // check if more streams are available
+             // and seek only with the video
+             return 0;
+--- avifile-0.7-0.7.45/plugins/libffmpeg/fillplugins.h.orig	2024-11-24 20:24:48.817749944 +0100
++++ avifile-0.7-0.7.45/plugins/libffmpeg/fillplugins.h	2024-11-25 20:17:17.838790800 +0100
+@@ -24,7 +24,7 @@ AVM_BEGIN_NAMESPACE;
+ 
+ FFCSTR(dr1);
+ 
+-static void libffmpeg_get_attr(avm::vector<AttributeInfo>& a, AVCodec* codec)
++static void libffmpeg_get_attr(avm::vector<AttributeInfo>& a, const AVCodec* codec)
+ {
+     if (!codec)
+ 	return;
+--- avifile-0.7-0.7.45/lib/codeckeeper.cpp.orig	2024-11-24 20:24:48.824416574 +0100
++++ avifile-0.7-0.7.45/lib/codeckeeper.cpp	2024-11-25 20:18:04.705203570 +0100
+@@ -294,8 +294,6 @@ static void plugin_fill()
+     video_codecs.clear();
+     audio_codecs.clear();
+ 
+-    // FFMPEG initialization
+-    avcodec_register_all();
+ 
+     uncompressed_FillPlugins(video_codecs);
+ 
+--- avifile-0.7-0.7.45/plugins/libffmpeg/FFAudioDecoder.h.orig	2004-07-10 16:36:46.000000000 +0200
++++ avifile-0.7-0.7.45/plugins/libffmpeg/FFAudioDecoder.h	2024-11-25 21:47:21.369517361 +0100
+@@ -9,10 +9,10 @@ AVM_BEGIN_NAMESPACE;
+ class FFAudioDecoder: public IAudioDecoder
+ {
+     static const uint_t MIN_AC3_CHUNK_SIZE = 16384;
+-    AVCodec *m_pAvCodec;
++    const AVCodec *m_pAvCodec;
+     AVCodecContext* m_pAvContext;
+ public:
+-    FFAudioDecoder(AVCodec*, const CodecInfo&, const WAVEFORMATEX*);
++    FFAudioDecoder(const AVCodec*, const CodecInfo&, const WAVEFORMATEX*);
+     ~FFAudioDecoder();
+     virtual int Convert(const void*, uint_t, void*, uint_t, uint_t*, uint_t*);
+     virtual uint_t GetMinSize() const;
+--- avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoEncoder.h.orig	2003-06-01 23:35:51.000000000 +0200
++++ avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoEncoder.h	2024-11-25 21:47:43.716062966 +0100
+@@ -11,7 +11,7 @@ AVM_BEGIN_NAMESPACE;
+ class FFVideoEncoder: public IVideoEncoder
+ {
+ public:
+-    FFVideoEncoder(AVCodec* av, const CodecInfo& info, fourcc_t compressor, const BITMAPINFOHEADER& header);
++    FFVideoEncoder(const AVCodec* av, const CodecInfo& info, fourcc_t compressor, const BITMAPINFOHEADER& header);
+     ~FFVideoEncoder();
+     //
+     // Encodes single frame
+@@ -43,7 +43,7 @@ public:
+     virtual float GetFps() const { return m_fFps; }
+     virtual int SetFps(float fps);
+ protected:
+-    AVCodec* m_pAvCodec;
++    const AVCodec* m_pAvCodec;
+     AVCodecContext* m_pAvContext;
+ 
+     CAPS m_Caps;
+--- avifile-0.7-0.7.45/plugins/libffmpeg/FFAudioDecoder.cpp.orig	2024-11-24 20:24:48.824416574 +0100
++++ avifile-0.7-0.7.45/plugins/libffmpeg/FFAudioDecoder.cpp	2024-11-30 20:55:04.766164927 +0100
+@@ -5,7 +5,7 @@
+ 
+ AVM_BEGIN_NAMESPACE;
+ 
+-FFAudioDecoder::FFAudioDecoder(AVCodec* av, const CodecInfo& info, const WAVEFORMATEX* wf)
++FFAudioDecoder::FFAudioDecoder(const AVCodec* av, const CodecInfo& info, const WAVEFORMATEX* wf)
+     :IAudioDecoder(info, wf), m_pAvCodec(av), m_pAvContext(0)
+ {
+ }
+@@ -55,16 +55,28 @@ int FFAudioDecoder::Convert(const void*
+     avpkt.data = (uint8_t*)in_data;
+     avpkt.size = in_size;
+     AVFrame *decoded_frame = av_frame_alloc();
+-    int hr = avcodec_decode_audio4(m_pAvContext, decoded_frame, &got_frame,
+-				  &avpkt);
+-    int data_size = av_samples_get_buffer_size(NULL, m_pAvContext->channels, decoded_frame->nb_samples, m_pAvContext->sample_fmt, 1);
++    int hr = avcodec_send_packet(m_pAvContext, &avpkt);
++    size_t written = 0;
++    while (hr >= 0)
++    {
++	hr = avcodec_receive_frame(m_pAvContext, decoded_frame);
++	if (hr == AVERROR(EAGAIN) || hr == AVERROR_EOF)
++       { hr = 0; break; }
++	if (hr < 0)
++	    break;
++        int data_size = av_samples_get_buffer_size(NULL, m_pAvContext->channels, decoded_frame->nb_samples, m_pAvContext->sample_fmt, 1);
++	if (data_size < 0)
++	{
++	    hr = data_size;
++	    break;
++	}
++        memcpy(out_data + written, decoded_frame->data[0], data_size);
++	written += data_size;
++    }
+     if (size_read)
+-	*size_read = (hr < 0) ? in_size : hr;
++         *size_read = (hr < 0) ? in_size : hr;
+     if (size_written)
+-	*size_written = data_size;
+-
+-    if (hr > 0)
+-        memcpy(out_data, decoded_frame->data[0], data_size);
++	*size_written = written;
+     av_free(decoded_frame);
+ 
+     if (hr < 0)
+--- avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoDecoder.h.orig	2024-11-24 20:24:48.817749944 +0100
++++ avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoDecoder.h	2024-11-30 20:56:22.329078066 +0100
+@@ -8,6 +8,7 @@
+ #define uint64_t_C(c)    (c ## ULL)
+ #endif
+ extern "C" {
++#include "avcodec.h"
+ #include "avformat.h"
+ }
+ 
+@@ -16,7 +17,7 @@ AVM_BEGIN_NAMESPACE;
+ class FFVideoDecoder: public IVideoDecoder, public IRtConfig
+ {
+ public:
+-    FFVideoDecoder(AVCodec* av,const CodecInfo& info, const BITMAPINFOHEADER& format, int flip);
++    FFVideoDecoder(const AVCodec* av,const CodecInfo& info, const BITMAPINFOHEADER& format, int flip);
+     virtual ~FFVideoDecoder();
+     virtual int DecodeFrame(CImage* pImage, const void* src, uint_t size,
+ 			    int is_keyframe, bool render = true,
+@@ -32,7 +33,7 @@ public:
+     virtual int SetValue(const char* name, int value);
+ 
+ protected:
+-    AVCodec *m_pAvCodec;
++    const AVCodec *m_pAvCodec;
+     AVCodecContext* m_pAvContext;
+     struct AVStream* m_pAvStream;
+     CAPS m_Caps;
+--- avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoDecoder.cpp.orig	2024-11-24 20:24:48.824416574 +0100
++++ avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoDecoder.cpp	2024-12-01 11:08:05.172230200 +0100
+@@ -25,7 +25,7 @@ struct BufferData {
+ 
+ AVM_BEGIN_NAMESPACE;
+ 
+-FFVideoDecoder::FFVideoDecoder(AVCodec* av, const CodecInfo& info, const BITMAPINFOHEADER& bh, int flip)
++FFVideoDecoder::FFVideoDecoder(const AVCodec* av, const CodecInfo& info, const BITMAPINFOHEADER& bh, int flip)
+     :IVideoDecoder(info, bh), m_pAvCodec(av), m_pAvContext(0),
+     m_Caps((CAPS)(CAP_YV12 | CAP_ALIGN16)), m_uiBuffers(0), m_bRestart(true),
+     m_Order(20), m_pImg(0), m_bUsed(false)
+@@ -36,8 +36,6 @@ FFVideoDecoder::FFVideoDecoder(AVCodec*
+     m_pAvStream = (struct AVStream*)bh.biXPelsPerMeter; Debug printf("Context %p\n", m_pAvStream);
+     if (1 && m_pFormat->biCompression == fccHFYU)
+     {
+-	// for now disabled
+-	m_pAvCodec->capabilities &= ~(AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1);
+ 	AVM_WRITE(m_Info.GetPrivateName(), "if you have troubles - use Win32 codec instead\n");
+ 	m_Caps = (CAPS) (m_Caps | CAP_YUY2);
+     }
+@@ -208,7 +206,7 @@ int FFVideoDecoder::DecodeFrame(CImage*
+ 	const char* drtxt = "doesn't support DR1\n";
+ 
+ 	m_bDirect = false;
+-	if (m_pAvCodec->capabilities & AV_CODEC_CAP_DR1)
++	if (0 && (m_pAvCodec->capabilities & AV_CODEC_CAP_DR1))
+ 	{
+ 	    drtxt = "not using DR1\n";
+ 	    if (pImage)
+@@ -239,14 +237,10 @@ int FFVideoDecoder::DecodeFrame(CImage*
+ 	    AVM_WRITE(m_Info.GetPrivateName(), drtxt);
+ 	m_bRestart = false;
+ 
+-	if (m_Info.fourcc == RIFFINFO_MPG1
+-	    && m_pAvCodec->capabilities & AV_CODEC_CAP_TRUNCATED)
+-	    m_pAvContext->flags |= AV_CODEC_FLAG_TRUNCATED;
+-
+ 	//m_pAvContext->error_resilience = 2;
+         //m_pAvContext->error_concealment = 3;
+ 	//m_pAvContext->workaround_bugs = FF_BUG_AUTODETECT;
+-	AVCodec* codec = avcodec_find_decoder_by_name(m_Info.dll);
++	const AVCodec* codec = avcodec_find_decoder_by_name(m_Info.dll);
+ #if 0
+ 	if (codec->options) {
+ 	    avm::vector<AttributeInfo>::const_iterator it;
+@@ -305,7 +299,7 @@ int FFVideoDecoder::DecodeFrame(CImage*
+     // try using draw_horiz_band if DR1 is unsupported
+     m_pAvContext->draw_horiz_band =
+ 	(!m_bDirect && pImage && pImage->Format() == IMG_FMT_YV12
+-	 && (m_pAvCodec->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)
++	 && 0 && (m_pAvCodec->capabilities & AV_CODEC_CAP_DRAW_HORIZ_BAND)
+ 	 && !pImage->Direction() && render) ? draw_slice : 0;
+     m_pAvContext->opaque = this;
+ 
+@@ -319,8 +313,13 @@ int FFVideoDecoder::DecodeFrame(CImage*
+     av_init_packet(&avpkt);
+     avpkt.data = (unsigned char*)src;
+     avpkt.size = size;
+-    int hr = avcodec_decode_video2(m_pAvContext, &pic, &got_picture,
+-				  &avpkt);
++    int hr = avcodec_send_packet(m_pAvContext, &avpkt);
++    if (hr >= 0) // FIXME: receiving more frames need refactor
++    {
++        hr = avcodec_receive_frame(m_pAvContext, &pic);
++	if (hr == 0)
++             got_picture = 1;
++    }
+     //printf("DECFF got_picture  %d  %p   del:%d  hr:%d size:%d\n", got_picture, src, m_pAvContext->delay, hr, size);
+     //printf("PictType  %d\n", m_pAvContext->pict_type);
+     //static int ctr=0; printf("WIDTH %dx%d  %d  r:%d\n", m_pAvContext->width, m_pAvContext->height, ctr++, m_pAvContext->pict_type);
+@@ -330,7 +329,6 @@ int FFVideoDecoder::DecodeFrame(CImage*
+ 	AVM_WRITE(m_Info.GetPrivateName(), "WARNING: FFVideoDecoder::DecodeFrame() hr=%d\n", hr);
+ 	return hr;
+     }
+-    if (!(m_pAvContext->flags & AV_CODEC_FLAG_TRUNCATED))
+     {
+ 	hr = size;
+         //m_bUsed = true;
+--- avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoEncoder.cpp.orig	2024-11-24 20:24:48.824416574 +0100
++++ avifile-0.7-0.7.45/plugins/libffmpeg/FFVideoEncoder.cpp	2024-12-01 20:48:24.483597798 +0100
+@@ -5,7 +5,7 @@
+ 
+ AVM_BEGIN_NAMESPACE;
+ 
+-static void libffmpeg_set_attr(avm::vector<AttributeInfo>& a, AVCodec* codec)
++static void libffmpeg_set_attr(avm::vector<AttributeInfo>& a, const AVCodec* codec)
+ {
+     if (!codec)
+ 	return;
+@@ -103,7 +103,7 @@ static void libffmpeg_set_attr(avm::vect
+ }
+ 
+ 
+-FFVideoEncoder::FFVideoEncoder(AVCodec* av, const CodecInfo& info, fourcc_t compressor, const BITMAPINFOHEADER& bh)
++FFVideoEncoder::FFVideoEncoder(const AVCodec* av, const CodecInfo& info, fourcc_t compressor, const BITMAPINFOHEADER& bh)
+     :IVideoEncoder(info), m_pAvCodec(av), m_pAvContext(0), m_Caps(CAP_YV12),
+     m_bh(bh), m_obh(bh)
+ {
+@@ -225,14 +225,17 @@ int FFVideoEncoder::EncodeFrame(const CI
+     pkt.size = GetOutputSize();
+     int got_output;
+ 
+-    int ret = avcodec_encode_video2(m_pAvContext, &pkt, &f, &got_output);
++    int ret = avcodec_send_frame(m_pAvContext, &f);
++    if (ret >= 0) // FIXME: receive multiple packets, requires some refactor
++        ret = avcodec_receive_packet(m_pAvContext, &pkt);
+     //printf("ECDING FF  size %d\n", rsize);
+     if (size)
+ 	*size = pkt.size;
+     if (is_keyframe) {
+-	*is_keyframe = m_pAvContext->coded_frame->key_frame ? 16 : 0;
++	*is_keyframe = (pkt.flags & AV_PKT_FLAG_KEY) ? 16 : 0;
+ 	//printf("KEYFRAME %d\n", *is_keyframe);
+     }
++    av_packet_unref(&pkt);
+     if (ci != src)
+         ci->Release();
+ 
+--- avifile-0.7-0.7.45/plugins/libffmpeg/libffmpeg.cpp.orig	2024-12-01 21:02:23.285720284 +0100
++++ avifile-0.7-0.7.45/plugins/libffmpeg/libffmpeg.cpp	2024-12-01 21:05:18.658103543 +0100
+@@ -137,7 +137,6 @@ static void av_init()
+     static int is_init = 0;
+     if (!is_init)
+     {
+-	avcodec_register_all();
+ 	is_init++;
+     }
+ }
+@@ -145,7 +144,7 @@ static void av_init()
+ static IVideoEncoder* ffmpeg_CreateVideoEncoder(const CodecInfo& info, fourcc_t compressor, const BITMAPINFOHEADER& bh)
+ {
+     av_init();
+-    AVCodec* av = avcodec_find_encoder_by_name(info.dll.c_str());
++    const AVCodec* av = avcodec_find_encoder_by_name(info.dll.c_str());
+     if (av)
+     {
+ 	switch (bh.biCompression)
+@@ -170,7 +169,7 @@ static IVideoDecoder* ffmpeg_CreateVideo
+ {
+     av_init();
+     AVM_WRITE("FFMPEG video decoder", "looking %s\n", info.dll.c_str());
+-    AVCodec* av = avcodec_find_decoder_by_name(info.dll.c_str());
++    const AVCodec* av = avcodec_find_decoder_by_name(info.dll.c_str());
+     if (av)
+ 	return new FFVideoDecoder(av, info, bh, flip);
+     ffmpeg_error_set("video codec not found");
+@@ -180,7 +179,7 @@ static IVideoDecoder* ffmpeg_CreateVideo
+ static IAudioDecoder* ffmpeg_CreateAudioDecoder(const CodecInfo& info, const WAVEFORMATEX* fmt)
+ {
+     av_init();
+-    AVCodec* av = avcodec_find_decoder_by_name(info.dll.c_str());
++    const AVCodec* av = avcodec_find_decoder_by_name(info.dll.c_str());
+     if (av)
+ 	return new FFAudioDecoder(av, info, fmt);
+     ffmpeg_error_set("audio codec not found");
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/avifile.git/commitdiff/8d8c14a7b47f3ec3497d7e6175045960b68664cc



More information about the pld-cvs-commit mailing list