gug-bg-herd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avifile] API/ABI break в Дебиан, пр ичинен от yours truly


From: Yavor Doganov
Subject: [avifile] API/ABI break в Дебиан, пр ичинен от yours truly
Date: Tue, 01 Dec 2009 16:36:36 +0200
User-agent: Wanderlust/2.15.6 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.7 Emacs/23.1 (i486-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)

Настъпах котарака много здраво.  Направих известни корекции (хирургът
би казал „съществени операции с необратими последствия“) по
изоставения пакет avifile [0], защото мой пакет зависи от него и имаше
доста грешки (3 от които критични).  Улисан в изчистването на 14
грешки и в стремежа си да успея да се компилира на всички архитектури
[1] [2] съвсем забравих за промените в публичния интерфейс (напр. в
avifile.h):

 class IStream
 {
 public:
-    static const uint_t ERR = ~0U;
-    static const uint_t KEYFRAME = 0x00000010L;
+    static const framepos_t ERR = ~0U;
+    static const int KEYFRAME = 0x00000010;
...
-    virtual int ReadFrames(void* buffer, uint_t bufsize, uint_t samples,
-                          uint_t& samples_read, uint_t& bytes_read)    =0;
+    virtual int ReadFrames(void* buffer, size_t buffer_size, size_t samples,
+                          size_t& samples_read, size_t& bytes_read)    =0;
 
Това със сигурност е чупене на API, но понеже компилирах две обратни
зависимости (cynthiune.app, onscripter) без проблеми, не се притесних.
Уви, такива промени чупят и ABI поне при 64-битовите архитектури (може
би и навсякъде), където size_t не отговаря на uint_t.  Късно е вече за
увеличаване на SONAME, защото моята версия вече е в testing.  Въпросът
е как да оправя бакията :-(.  Докладваха и грешки (FTBFS) за
onscripter [3] и dvr [4].  Отговорникът на onscripter приложи леко
грозна кръпка [5], но все пак с нея пакета му вече се компилира
навсякъде.

Молбата ми е да прегледате приложените (мои) кръпки за onscripter,
cynthiune.app и dvr и да потвърдите, че са читави.  Не разбирам почти
нищо от C++ за съжаление, което обяснява донякъде (но не напълно) и
този голям гаф.  Ако може да тествате пакетите (компилиране + runtime)
на 64-битова архитектура, ще съм особено благодарен.  Cynthiune с
моята кръпка изпълнява [6] без проблеми на i686-linux-gnu.

[0] http://bugs.debian.org/540906
[1] http://packages.qa.debian.org/a/avifile/news/20091103T212148Z.html
[2] http://packages.qa.debian.org/a/avifile/news/20091119T170230Z.html
[3] http://bugs.debian.org/556820
[4] http://bugs.debian.org/556830
[5] 
http://patch-tracker.debian.org/patch/series/view/onscripter/0.0.20091115-2/01_fix_FTBFS_AVIWrapper.cpp.patch
[6]
http://samples.mplayerhq.hu/A-codecs/WMA/Bangles%2001%20-%20Walk%20Like%20An%20Egyptian.wma
--- onscripter-0.0.20091115.orig/AVIWrapper.cpp
+++ onscripter-0.0.20091115/AVIWrapper.cpp
@@ -27,6 +27,7 @@
 #include <avm_cpuinfo.h>
 #include <avm_output.h>
 #include <avifile.h>
+#include <version.h>
 #include <videodecoder.h>
 #include <image.h>
 #include <stdlib.h>
@@ -35,8 +36,6 @@
 #define DEFAULT_AUDIOBUF 4096
 #define AVI_FINISH_EVENT 12345
 
-#define AVIFILE_VERSION 747
-
 AVIWrapper::AVIWrapper()
 {
     screen_overlay = NULL;
@@ -61,7 +60,7 @@
 int AVIWrapper::init( char *filename, bool debug_flag )
 {
     this->debug_flag = debug_flag;
-#if AVIFILE_VERSION >= 747
+#if AVIFILE_VERSION >= 1839
     if ( !debug_flag ) avm::AvmOutput::singleton()->resetDebugLevels(-1);
 #else
     if ( !debug_flag ) avm::out.resetDebugLevels(-1);
@@ -145,8 +144,13 @@
     if ( len == 0 )
         status = AVI_STOP;
 
+#if AVIFILE_VERSION >= 1840
+    size_t ocnt;
+    size_t samples;
+#else
     uint_t ocnt;
     uint_t samples;
+#endif
     uint_t count = 0;
 
     if ( remaining_count > 0 ){
@@ -166,7 +170,16 @@
     }
         
     while ( len > 0 && !a_stream->Eof() ){
+#if AVIFILE_VERSION >= 1840
+      {
+       size_t tmp_len = (size_t)len;
+
+       a_stream->ReadFrames( remaining_buffer, tmp_len, tmp_len, samples,
+                             ocnt );
+      }
+#else
         a_stream->ReadFrames( remaining_buffer, len, len, samples, ocnt );
+#endif
         if ( ocnt <= len ){
             memcpy( stream+count, remaining_buffer, ocnt );
             len -= ocnt;
--- dvr-3.2.orig/dvr-qtgui/QCodecConfigImpl.cpp
+++ dvr-3.2/dvr-qtgui/QCodecConfigImpl.cpp
@@ -41,10 +41,10 @@
 {
 //     const CodecInfo* ci=0;
        
-       avm::vector<CodecInfo>::iterator it_ci;
+  avm::vector<avm::CodecInfo>::iterator it_ci;
 
        for(it_ci=video_codecs.begin(); it_ci!=video_codecs.end(); it_ci++) {
-               if(!it_ci->direction & CodecInfo::Encode) continue;
+         if(!it_ci->direction & avm::CodecInfo::Encode) continue;
                qlb_codec_list->insertItem(QString(it_ci->GetName()), 0);
                if(it_ci->fourcc==compressor) {
                        qlb_codec_list->setSelected(0, true);
@@ -66,11 +66,11 @@
 
 void QCodecConfigImpl::setVideoCodecName(const string &vcn) {
        video_codec_name=vcn;
-       avm::vector<CodecInfo>::iterator it_ci;
-       CodecInfo::match(0xffffffff, CodecInfo::Video, NULL);
+       avm::vector<avm::CodecInfo>::iterator it_ci;
+       avm::CodecInfo::match(0xffffffff, avm::CodecInfo::Video, NULL);
        
        for(it_ci=video_codecs.begin(); it_ci!=video_codecs.end(); it_ci++) {
-               if(!(it_ci->direction & CodecInfo::Encode)) continue;
+         if(!(it_ci->direction & avm::CodecInfo::Encode)) continue;
                qlb_codec_list->insertItem(it_ci->GetName(), 0);
                if(it_ci->GetName()==video_codec_name) {
                        compressor=it_ci->fourcc;
@@ -83,7 +83,7 @@
 
 void QCodecConfigImpl::changeCodec() {
        // search fot the fourcc of the selected codec
-       avm::vector<CodecInfo>::iterator it_ci;
+  avm::vector<avm::CodecInfo>::iterator it_ci;
 
        video_codec_name=(const char*)qlb_codec_list->currentText();
        
@@ -99,7 +99,7 @@
        // attributs list update
        qlv_attribute_list->clear();
        QListViewItem *a;
-       avm::vector<AttributeInfo>::iterator it_a;
+       avm::vector<avm::AttributeInfo>::iterator it_a;
        for(it_a=it_ci->encoder_info.begin(); it_a!=it_ci->encoder_info.end(); 
it_a++) {
                QString string_value;
                int tmp_int;
@@ -107,28 +107,28 @@
     float tmp_float;
 
                switch(it_a->kind) {
-    case AttributeInfo::Float:
+               case avm::AttributeInfo::Float:
                        if(CodecGetAttr(*it_ci, it_a->GetName(), &tmp_float)) {
                                string_value=null_value;
                        } else {
                                string_value=QString::number(double(tmp_float));
                        }
                        break;
-               case AttributeInfo::Integer :   
+               case avm::AttributeInfo::Integer :
                        if(CodecGetAttr(*it_ci, it_a->GetName(), &tmp_int)) {
                                string_value=null_value;
                        } else {
                                string_value=QString::number(tmp_int);
                        }
                        break;
-               case AttributeInfo::String:             
+               case avm::AttributeInfo::String:
                        if(CodecGetAttr(*it_ci, it_a->GetName(), &tmp_char)) {
                                string_value=null_value;
                        } else {
                                string_value=tmp_char;
                        }
                        break;
-               case AttributeInfo::Select:     
+               case avm::AttributeInfo::Select:
                        string_value=null_value;
                        break;
                }
@@ -147,12 +147,12 @@
 void QCodecConfigImpl::changeAttribute(QListViewItem *i) {
        qle_attribute_value->setText(i->text(1));
 
-       avm::vector<CodecInfo>::iterator it_ci;
+       avm::vector<avm::CodecInfo>::iterator it_ci;
        for(it_ci=video_codecs.begin(); it_ci!=video_codecs.end(); it_ci++) {
                
if(QString::compare(it_ci->GetName(),video_codec_name.c_str())==0) break;
        }
 
-       avm::vector<AttributeInfo>::iterator it_a;
+       avm::vector<avm::AttributeInfo>::iterator it_a;
        for(it_a=it_ci->encoder_info.begin(); it_a!=it_ci->encoder_info.end(); 
it_a++) {
                if(QString::compare(it_a->GetName(), i->text(0))==0) {
                        current_attribute_kind=it_a->kind;
@@ -165,22 +165,22 @@
 void QCodecConfigImpl::setAttribute() {
        if(QString::compare(qle_attribute_value->text(), null_value) && 
QString::compare(qle_attribute_value->text(), "")) {
                
-               avm::vector<CodecInfo>::iterator it_ci;
+         avm::vector<avm::CodecInfo>::iterator it_ci;
                for(it_ci=video_codecs.begin(); it_ci!=video_codecs.end(); 
it_ci++) {
                        
if(QString::compare(it_ci->GetName(),video_codec_name.c_str())==0) break;
                }
 
                switch(current_attribute_kind) {
-               case AttributeInfo::Float :     
+               case avm::AttributeInfo::Float :
                        CodecSetAttr(*it_ci, 
qlv_attribute_list->currentItem()->text(0), 
qle_attribute_value->text().toFloat());
                        break;
-    case AttributeInfo::Integer:
+               case avm::AttributeInfo::Integer:
                        CodecSetAttr(*it_ci, 
qlv_attribute_list->currentItem()->text(0), 
qle_attribute_value->text().toInt());
                        break;
-               case AttributeInfo::String:             
+               case avm::AttributeInfo::String:
                        CodecSetAttr(*it_ci, 
qlv_attribute_list->currentItem()->text(0), qle_attribute_value->text());
                        break;
-               case AttributeInfo::Select:     
+               case avm::AttributeInfo::Select:
                        //don't now what to do
                        break;
                }
--- dvr-3.2.orig/dvr-qtgui/QCodecConfigImpl.h
+++ dvr-3.2/dvr-qtgui/QCodecConfigImpl.h
@@ -45,7 +45,7 @@
 protected:
        string  video_codec_name;
        int compressor;
-       AttributeInfo::Kind current_attribute_kind;
+       avm::AttributeInfo::Kind current_attribute_kind;
 };
 
 #endif // QCODECCONFIGIMPL_H
--- dvr-3.2.orig/lib/dvr.cpp
+++ dvr-3.2/lib/dvr.cpp
@@ -245,7 +245,7 @@
 
   if(video_channel<0 || video_channel>=signed(v4l->videoChannels().size())) {
                char tmp[300];
-    sprintf(tmp, "invalid channel number, should be less than %d", 
v4l->videoChannels().size());
+    sprintf(tmp, "invalid channel number, should be less than %zd", 
v4l->videoChannels().size());
                error_message=string(tmp);
                return false;
   }
@@ -576,12 +576,12 @@
 
        // looking for the fourcc of the codec
        video_codec=0;
-       CodecInfo::match(0xffffffff, CodecInfo::Video, NULL);
+       avm::CodecInfo::match(0xffffffff, avm::CodecInfo::Video, NULL);
        
        try {
-       avm::vector<CodecInfo>::iterator it_ci;
+         avm::vector<avm::CodecInfo>::iterator it_ci;
        for(it_ci=video_codecs.begin(); it_ci!=video_codecs.end(); it_ci++) {
-               if(!(it_ci->direction & CodecInfo::Encode)) continue;
+         if(!(it_ci->direction & avm::CodecInfo::Encode)) continue;
                if(it_ci->GetName()==me->video_codec_name) {
                        video_codec=it_ci->fourcc;
                        break;
@@ -592,7 +592,7 @@
                cerr<<"available video codecs are : "<<endl;
                string s;
                for(it_ci=video_codecs.begin(); it_ci!=video_codecs.end(); 
it_ci++) {
-                       if(!(it_ci->direction & CodecInfo::Encode)) continue;
+                 if(!(it_ci->direction & avm::CodecInfo::Encode)) continue;
                        if(s=="") s=string("'")+it_ci->GetName()+string("'");
                        else s+=string(", '")+it_ci->GetName()+string("'");
                }
2009-12-01  Yavor Doganov  <address@hidden>

        * Bundles/WindowsMedia.CWMFile.h (WMStreamReadFrames): Adjust
          prototype to the new avifile API.
        * Bundles/WindowsMedia/CWMFile.cpp: Include <infotypes.h>.
        (WMFileAudioStreamCount, WMStreamGetFrameSize): Cast the
        result to unsigned int.
        (WMStreamReadFrames) <_samplesRead, _bytesRead>: Declare of
        type size_t.  Amend the call to readStream->ReadFrames
        accordingly.

--- cynthiune.app-0.9.5.orig/Bundles/WindowsMedia/CWMFile.cpp
+++ cynthiune.app-0.9.5/Bundles/WindowsMedia/CWMFile.cpp
@@ -26,6 +26,7 @@
 
 #include <fstream>
 #include <avifile.h>
+#include <infotypes.h>
 
 #include "CWMFile.h"
 
@@ -74,7 +75,7 @@
 
   readFile = (avm::IReadFile *) file;
 
-  return readFile->AudioStreamCount ();
+  return (unsigned int) readFile->AudioStreamCount ();
 }
 
 WMStream *
@@ -117,7 +118,7 @@
 
   readStream = (avm::IReadStream *) stream;
 
-  return readStream->GetFrameSize ();
+  return (unsigned int) readStream->GetFrameSize ();
 }
 
 void
@@ -127,7 +128,7 @@
                   unsigned int *duration)
 {
   avm::IReadStream *readStream;
-  StreamInfo *streamInfo;
+  avm::StreamInfo *streamInfo;
 
   readStream = (avm::IReadStream *) stream;
   streamInfo = readStream->GetStreamInfo ();
@@ -142,10 +143,10 @@
 int
 WMStreamReadFrames (WMStream *stream,
                     void *buffer, unsigned int bufferSize,
-                    unsigned int samples, unsigned int *samplesRead,
-                    unsigned int *bytesRead)
+                    unsigned int samples, size_t *samplesRead,
+                    size_t *bytesRead)
 {
-  unsigned int _samplesRead, _bytesRead;
+  size_t _samplesRead, _bytesRead;
   avm::IReadStream *readStream;
   int result, eof;
 
@@ -157,10 +158,13 @@
 
   readStream = (avm::IReadStream *) stream;
   while (!result && !_bytesRead)
-    result = ((readStream->Eof ())
+    {
+      size_t tmp_bufferSize = (size_t) bufferSize;
+      result = ((readStream->Eof ())
               ? -1
-              : readStream->ReadFrames (buffer, bufferSize, bufferSize,
-                                        _samplesRead, _bytesRead));
+             : readStream->ReadFrames (buffer, tmp_bufferSize, tmp_bufferSize,
+                                       _samplesRead, _bytesRead));
+    }
 
   *samplesRead = _samplesRead;
   *bytesRead = _bytesRead;
--- cynthiune.app-0.9.5.orig/Bundles/WindowsMedia/CWMFile.h
+++ cynthiune.app-0.9.5/Bundles/WindowsMedia/CWMFile.h
@@ -47,8 +47,8 @@
                        unsigned int *duration);
 int WMStreamReadFrames (WMStream *stream,
                         void *buffer, unsigned int bufferSize,
-                        unsigned int samples, unsigned *samplesRead,
-                        unsigned int *bytesRead);
+                        unsigned int samples, size_t *samplesRead,
+                        size_t *bytesRead);
 void WMStreamSeekTime (WMStream *stream, unsigned int position);
 
 #ifdef __cplusplus

reply via email to

[Prev in Thread] Current Thread [Next in Thread]