Projects
home:enzokiel
avidemux3
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 35
View file
avidemux3.changes
Changed
@@ -1,7 +1,7 @@ ------------------------------------------------------------------- -Fri Sep 04 12:44:49 UTC 2026 - enzokiel@kabelmail.de +Mon Sep 07 14:14:33 UTC 2026 - enzokiel@kabelmail.de -- Update to version 2.8.2.git20260904 +- Update to version 2.8.2.git20260905 - No changelog available -------------------------------------------------------------------
View file
avidemux3.spec
Changed
@@ -19,7 +19,7 @@ Name: avidemux3 Summary: Graphical video editing and transcoding tool License: GPL-2.0-only -Version: 2.8.2.git20260904 +Version: 2.8.2.git20260905 Release: 0 URL: https://github.com/mean00/avidemux2 ExclusiveArch: %ix86 x86_64
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asf.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asf.cpp
Changed
@@ -264,114 +264,122 @@ */ uint8_t asfHeader::getFrame(uint32_t framenum,ADMCompressedImage *img) { - img->dataLength=0; - img->flags=AVI_KEY_FRAME; - uint32_t len=0; - if(framenum>=nbImage) - { - printf("ASF Going out of bound %u %u\n",framenum, nbImage); - return 0; - } - if(!_indexframenum.frameLen) - { - goto gotcha; - } - // In case curSeq is stored as one byte.. - curSeq&=0xff; - // - - aprintf("Framenum %u len: %u curSeq %u frameSeq=%u packetnb=%u \n", - framenum,_indexframenum.frameLen,curSeq, - _indexframenum.segNb,_indexframenum.packetNb); - // Seeking ? - if(_indexframenum.segNb!=curSeq || _indexframenum.segNb==1) - { - aprintf("Seeking.. curseq:%u wanted seq:%u packet=%" PRIu64"\n",curSeq,_indexframenum.segNb,_indexframenum.packetNb); - if(!_packet->goToPacket(_indexframenum.packetNb)) + uint32_t len; + img->dataLength = 0; + img->flags = AVI_KEY_FRAME; + if (framenum >= nbImage) { - printf("ASF Cannot seek to frame %u\n",framenum); - return 0; + ADM_warning("Requested frame %u out of bounds, must be < %u\n", framenum, nbImage); + return 0; } - _packet->purge(); - curSeq=_indexframenum.segNb; - printf("Seeking done, starting at seq=%u\n",curSeq); - } - - - len=0; - uint32_t delta; - while(1) - { - while(readQueue.size()) + asfIndex *dx = &(_indexframenum); + if (dx->frameLen > ADM_COMPRESSED_MAX_DATA_LENGTH) + { + ADM_error("Frame %u size %u exceeds max. supported.\n", framenum, dx->frameLen); + return 0; + } + if (!dx->frameLen) { - asfBit *bit; - bit=readQueue.front(); - readQueue.pop_front(); - aprintf(">found packet of size %d seq %d, while curseq =%d wanted seg=%u current offset=%u, packet=%u\n", - bit->len,bit->sequence,curSeq,_indexframenum.segNb,len,bit->packet); - // Here it is tricky - // if len==0 we are reading the first part of our frame - // The packet may starts with segments from the previous frame - // discard them - // Delta is just a security as it should be slightly >10 - delta=256+bit->sequence-_indexframenum.segNb; - delta &=0xff; - if(!len) // Starting a new frame - { - if(_indexframenum.segNb != bit->sequence ) - { - aprintf("Dropping seq=%u too old for %u delta %d\n", - bit->sequence,_indexframenum.segNb,delta); - storageQueue.push_back(bit); - bit=NULL; - if(delta<230) - { - printf("ASF Very suspicious delta :%" PRIu32"\n",delta); - } - continue; - } - // We have found our first chunk - curSeq=bit->sequence; - memcpy(img->data,bit->data,bit->len); - len=bit->len; - delete bit->data; - delete bit; - continue; - } - // Continuing a frame - // If the seq number is different it is the beginning of a new frame - if(bit->sequence!=curSeq ) - { - aprintf("New sequence %u->%u while loading %u frame\n",curSeq,bit->sequence,framenum); - img->dataLength=len; - readQueue.push_front(bit); - curSeq=bit->sequence; goto gotcha; - } - // still same sequence ...add - memcpy(img->data+len,bit->data,bit->len); - len+=bit->len; - storageQueue.push_back(bit); - bit=NULL; } - if(!_packet->nextPacket(_videoStreamId)) + // In case curSeq is stored as one byte.. + curSeq&=0xff; + aprintf("Framenum %u len: %u curSeq: %u frameSeq: %u packetnb: %llu\n", + framenum, dx->frameLen, curSeq, dx->segNb, dx->packetNb); + // Seeking ? + if (dx->segNb != curSeq || dx->segNb == 1) { - printf("ASF Packet Error\n"); - return 0; + aprintf("Seeking... curSeq: %u wanted seq: %u packet: %" PRIu64"\n", curSeq, dx->segNb, dx->packetNb); + if(!_packet->goToPacket(dx->packetNb)) + { + ADM_error("Cannot seek to frame %u\n", framenum); + return 0; + } + _packet->purge(); + curSeq = dx->segNb; + ADM_info("Seeking done, starting at seq %u \n", curSeq); + } + + len = 0; + uint32_t delta; + while(1) + { + while(readQueue.size()) + { + asfBit *bit; + bit = readQueue.front(); + readQueue.pop_front(); + aprintf("-> found packet of size %d seq %d while curseq = %d wanted seg = %u, acc. data len: %u, packet: %u\n", + bit->len, bit->sequence, curSeq, dx->segNb, len, bit->packet); + // Here it is tricky + // if len==0 we are reading the first part of our frame + // The packet may starts with segments from the previous frame + // discard them + // Delta is just a security as it should be slightly >10 + delta = 256 + bit->sequence - dx->segNb; + delta &= 0xff; + if (!len) // Starting a new frame + { + if (dx->segNb != bit->sequence) + { + aprintf("Dropping seq %u, too old for seg %u, delta: %d\n", bit->sequence, dx->segNb, delta); + storageQueue.push_back(bit); + bit = NULL; + if (delta < 230) + { + aprintf("ASF Very suspicious delta : %" PRIu32"\n", delta); + } + continue; + } + // We have found our first chunk + curSeq = bit->sequence; + ADM_assert(bit->len <= dx->frameLen); + memcpy(img->data, bit->data, bit->len); + len = bit->len; + storageQueue.push_back(bit); + bit = NULL; + continue; + } + // Continuing a frame + // If the seq number is different it is the beginning of a new frame + if (bit->sequence != curSeq) + { + aprintf("New sequence %u -> %u while loading frame %u\n", curSeq, bit->sequence, framenum); + readQueue.push_front(bit); + curSeq = bit->sequence; + goto gotcha; + } + // still same sequence ...add + ADM_assert((bit->len <= dx->frameLen) && (len + bit->len <= dx->frameLen)); + memcpy(img->data + len, bit->data, bit->len); + len += bit->len; + storageQueue.push_back(bit); + bit = NULL; + } + if(_packet->finished()) + { + ADM_warning("Too close to EOF.\n"); + return 0; + } + if(!_packet->nextPacket(_videoStreamId)) + { + ADM_error("Packet error.\n"); + return 0; + } + _packet->skipPacket(); } - _packet->skipPacket(); - } gotcha: - - img->dataLength=len; - img->demuxerDts=_indexframenum.dts; - img->demuxerPts=_indexframenum.pts; - img->flags=_indexframenum.flags; - if(len!=_indexframenum.frameLen) - { - ADM_error("ASF Frame=%u :-> Mismatch found len : %u expected %u\n",framenum,len, _indexframenum.frameLen); - } - aprintf(">>Len %d seq %d\n",len,curSeq); - return 1; + aprintf("-> Len %u seq %u\n", len, curSeq); + if (len != dx->frameLen) + { + ADM_error("Frame %u size mismatch: got %u, expected %u\n", framenum, len, dx->frameLen); + return 0; + } + img->dataLength = len; + img->demuxerDts = dx->dts; + img->demuxerPts = dx->pts; + img->flags = dx->flags; + + return 1; } //EOF
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfAudio.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfAudio.cpp
Changed
@@ -129,6 +129,13 @@ bit=readQueue.front(); readQueue.pop_front(); // still same sequence ...add + if(bit->len > maxSize) + { + ADM_error("Packet size %u out of bounds, max: %u\n", bit->len, maxSize); + storageQueue.push_back(bit); + bit = NULL; + return 0; + } memcpy(dest,bit->data,bit->len); *len=bit->len; *dts=bit->pts; // for audio PTS=DTS... @@ -142,6 +149,8 @@ bit=NULL; return 1; } + if(_packet->finished()) + break; r=_packet->nextPacket(_streamId); _packet->skipPacket(); if(!r)
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfIo.h -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfIo.h
Changed
@@ -3,7 +3,6 @@ uint64_t lo,hi; lo=read32(); hi=read32(); - _offset+=8; ADM_assert(_offset<=pakSize); return lo+(hi<<32);
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfPacket.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfPacket.cpp
Changed
@@ -54,11 +54,16 @@ asfPacket::asfPacket(FILE *f,uint64_t nb,uint32_t pSize,queueOfAsfBits *q,queueOfAsfBits *s,uint64_t startDataOffset) { _fd=f; + ADM_assert(_fd); pakSize=pSize; ADM_assert(pakSize); packetStart=ftello(f); + ADM_assert(packetStart >= 0); + ADM_assert(!fseeko(f, 0, SEEK_END)); + fileSize = ftello(f); + ADM_assert(fileSize > 0); + ADM_assert(!fseeko(f, packetStart, SEEK_SET)); aprintf("Packet created at %" PRIx64"\n",packetStart); - ADM_assert(_fd); queue=q; storage=s; ADM_assert(q); @@ -73,6 +78,18 @@ { } +/** + \fn finished +*/ +uint8_t asfPacket::finished(void) +{ + int64_t pos = ftello(_fd); + if (pos < 0) return 1; + // we need at least 5 bytes (1 marker + 2 always zero + 1 length flags + 1 prop. flags) + if (pos + 5 >= fileSize) return 1; + + return 0; +} /** \fn goToPacket */ @@ -80,7 +97,8 @@ { uint64_t offset=_startDataOffset+packet*pakSize; aprintf("asfPacket::goToPacket offset = %" PRIu64", packet = %" PRIu64", packet size = %" PRIu32"\n",offset,packet,pakSize); - fseeko(_fd,offset,SEEK_SET); + if(fseeko(_fd,offset,SEEK_SET)) + return 0; currentPacket=packet; purge(); return 1; @@ -312,7 +330,10 @@ // Do some sanity check if(_offset+paddingLen!=pakSize) { - ADM_warning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! %d+%d!=%d\n",_offset,paddingLen,pakSize); + // Padding length equal zero is allowed with multiple payloads + // by specification, should be inferred from packet size then. + if(paddingLen) + ADM_warning("Bogus padding length: %u + %u != %u\n", _offset, paddingLen, pakSize); if(pakSize>(_offset+paddingLen)) { skip(pakSize-_offset-paddingLen);
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfPacket.h -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Asf/ADM_asfPacket.h
Changed
@@ -51,6 +51,7 @@ uint8_t skip( uint32_t how); FILE *_fd; uint64_t packetStart; + int64_t fileSize; uint8_t segmentId; uint32_t pakSize; queueOfAsfBits *queue; @@ -70,7 +71,7 @@ uint8_t nextPacket(uint8_t streamWanted); uint8_t skipPacket(void); - + uint8_t finished(void); uint64_t getPos(void); uint32_t getPayloadLen(void); #ifdef ASF_INLINE
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Flv/ADM_flv.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Flv/ADM_flv.cpp
Changed
@@ -1506,6 +1506,11 @@ { if(frame>=videoTrack->_nbIndex) return 0; flvIndex *idx=&(videoTrack->_indexframe); + if(idx->size > ADM_COMPRESSED_MAX_DATA_LENGTH) + { + ADM_error("Frame %u size %u exceeds max. supported.\n", frame, idx->size); + return 0; + } #ifdef USE_BUFFERED_IO parser->setpos(idx->pos); if(!read(idx->size,img->data))
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/Flv/ADM_flvAudio.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/Flv/ADM_flvAudio.cpp
Changed
@@ -135,6 +135,12 @@ return false; } x=&(_track->_indexcurrentBlock); + currentBlock++; + if (x->size > maxSize) + { + ADM_error("Packet %u / %u too large: %u, max: %s\n", currentBlock, _track->_nbIndex, x->size, maxSize); + return false; + } #ifdef USE_BUFFERED_IO aparser->read32(x->size,buffer); #else @@ -142,9 +148,8 @@ #endif *osize=x->size; *dts=((uint64_t)x->dtsUs); - - currentBlock++; - return 1; + + return true; } /** \fn goToBlock
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_odml_odml.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_odml_odml.cpp
Changed
@@ -23,10 +23,13 @@ #include "fourcc.h" #include "ADM_openDML.h" - -#define aprintf(...) {} - //#define OPENDML_VERBOSE +#ifdef OPENDML_VERBOSE + #define aprintf(...) printf +#else + #define aprintf(...) {} +#endif + #ifdef _MSC_VER #define ADM_PACKED(c,n) __pragma( pack(push, 1) ) c n __pragma( pack(pop) ) #else @@ -225,7 +228,16 @@ printf("AVIProblem reading secondary index (%u/%u) trying to continue \n",i,masterIndex.nbEntryInUse); goto _cntue; } - total+=second.nbEntryInUse; + uint64_t check = total; + check += second.nbEntryInUse; + if (check > UINT32_MAX) + { + ADM_error("Number of frames out of bounds, bailing out.\n"); + free(superEntries); + superEntries = NULL; + return 0; + } + total = check; } _cntue: printf("Found a grand total of %" PRIu32" frames\n",total); @@ -239,10 +251,12 @@ fseeko(_fd,superEntriesi.offset,SEEK_SET); fcc=read32(); len=read32(); +#ifdef OPENDML_VERBOSE aprintf("subindex : %" PRIu32" size %" PRIu32" (%lx)",i,len,len); aprintf("Seeking to %" PRIx64"\n",superEntriesi.offset); fourCC::print(fcc);aprintf("\n"); +#endif //if(1!=fread(&second,sizeof(second),1,_fd)) if(!readSecondary(&second,_fd)) {
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_openDML.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_openDML.cpp
Changed
@@ -93,18 +93,32 @@ uint8_t OpenDMLHeader::getFrame(uint32_t framenum,ADMCompressedImage *img) { if(framenum>= (uint32_t)_videostream.dwLength) return 0; -uint64_t offset=_idxframenum.offset; //+_mdatOffset; - - fseeko(_fd,offset,SEEK_SET); - fread(img->data, _idxframenum.size, 1, _fd); - img->dataLength=_idxframenum.size; - img->flags=_idxframenum.intra; - img->demuxerDts=_idxframenum.dts; // FIXME - img->demuxerPts=_idxframenum.pts; - - aprintf("Size: %lu\n",_idxframenum.size); + odmlIndex *dx = &(_idxframenum); + // Truncating a compressed image may result in massive damage + // initially going unnoticed, better fail right away. + if (dx->size > ADM_COMPRESSED_MAX_DATA_LENGTH) + { + ADM_error("Abnormally large frame %" PRIu32" size %" PRIu32", bailing out.\n", framenum, dx->size); + return 0; + } + if (0 != fseeko(_fd, dx->offset, SEEK_SET)) + { + ADM_error("Seek to 0x%" PRIx64" for frame %" PRIu32" failed.\n", dx->offset, framenum); + return 0; + } + if (1 != fread(img->data, dx->size, 1, _fd)) + { + ADM_error("Reading frame %" PRIu32" failed.\n", framenum); + return 0; + } + img->dataLength = dx->size; + img->flags = dx->intra; + img->demuxerDts = dx->dts; // FIXME + img->demuxerPts = dx->pts; + + aprintf("Frame %lu size: %lu\n", dx->size); // if(offset & 1) printf("odd!\n"); - return 1; + return 1; } /** \fn getFrame @@ -266,7 +280,7 @@ uint8_t badAvi=0; uint32_t rd; - printf("** opening OpenDML files **"); + printf("** opening OpenDML files **\n"); _fd=ADM_fopen(name,"rb"); if(!_fd) @@ -551,7 +565,8 @@ printf("\nOpenDML file successfully read..\n"); if(ret==1) { - computePtsDts(); + if (!computePtsDts()) + return 0; removeEmptyFrames(); } ADM_info("PtsAvailable : %d\n",(int)ptsAvailable); @@ -608,7 +623,11 @@ uint8_t OpenDMLHeader::computePtsDts(void) { // if it is mpeg4-sp, removed packet bitstream & reindex - if(isMpeg4Compatible(_videostream.fccHandler)) OpenDMLHeader::unpackPacked( ); + if(isMpeg4Compatible(_videostream.fccHandler)) + { + if (ADM_OK != OpenDMLHeader::unpackPacked()) + return 0; + } // Now if we have B frames, it is properly tagged // Begin by putting PTS=DTS i.e. no B-frames for(int i=0;i<_videostream.dwLength;i++) @@ -923,12 +942,13 @@ walk(n); delete n; } - p->curPos=ftello(p->fd); if(MKFCC('s','t','r','l')==sub) { + ADM_assert(_nbTrack < ADM_ODML_MAX_TRACKS); _nbTrack++; } - + p->curPos = ftello(p->fd); + if(p->curPos & 1) p->skip(1); // ??? } break; default:
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_openDML.h -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_openDML.h
Changed
@@ -17,6 +17,9 @@ #include "ADM_Video.h" #include "ADM_riff.h" #include "ADM_audioStream.h" + +#define ADM_ODML_MAX_TRACKS 10 + class AVDMGenericAudioStream; typedef struct odmlIndex @@ -82,7 +85,7 @@ //_________________________________________ // This is temporary stuff to read the avi //_________________________________________ - odmlTrack _Tracks10; + odmlTrack _TracksADM_ODML_MAX_TRACKS; odmlIndex _regularIndex; odmlIndex _movi; //_________________________________________
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_openDMLDepack.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_openDMLDepack.cpp
Changed
@@ -47,173 +47,184 @@ */ uint8_t OpenDMLHeader::unpackPacked( void ) { - uint32_t nbFrame; - uint8_t ret=0; - uint32_t targetIndex=0,nbVop; - uint32_t nbDuped=0; - uint32_t timcincbits=16; /* Nb bits used to code time_inc 16 is a safe default */ - - ADM_vopS myVopsMAX_VOP; // should be enough - // here we got the vidHeader to get the file easily - // we only deal with avi now, so cast it to its proper type (i.e. avi) - - - // now we are ready to rumble - // First get a unpack buffe - uint8_t *buffer=new uint8_t 2*getWidth()*getHeight(); - - // For each frame we lookup x times the VOP header - // the first one become frame n, the second one becomes frame N+1 - // Image contaning only VOP header are royally ignored - // We should get about the same number of in/out frame - - nbFrame=getMainHeader()->dwTotalFrames; - - odmlIndex *newIndex=new odmlIndexnbFrame+MAX_VOP; // Due to the packed vop, we may end up with more images - // Assume MAX_VOP Bframes maximum - ADM_assert(newIndex); - - #ifndef __HAIKU__ - uint32_t originalPriority = getpriority(PRIO_PROCESS, 0); - #endif + uint32_t nbFrame; + uint8_t ret = 0; + uint32_t targetIndex = 0, nbVop; + uint32_t nbDuped = 0; + uint32_t timcincbits = 16; /* Nb bits used to code time_inc 16 is a safe default */ + + ADM_vopS myVopsMAX_VOP; // should be enough + // here we got the vidHeader to get the file easily + // we only deal with avi now, so cast it to its proper type (i.e. avi) + + + // now we are ready to rumble + // First get a unpack buffe + if (getWidth() > MAXIMUM_SIZE || getWidth() > MAXIMUM_SIZE) + return 0; + uint32_t bufferSize = 2 * getWidth() * getHeight(); + if (bufferSize > ADM_COMPRESSED_MAX_DATA_LENGTH) + bufferSize = ADM_COMPRESSED_MAX_DATA_LENGTH; + uint8_t *buffer = new uint8_t bufferSize; + + // For each frame we lookup x times the VOP header + // the first one become frame n, the second one becomes frame N+1 + // Image contaning only VOP header are royally ignored + // We should get about the same number of in/out frame + + nbFrame = getMainHeader()->dwTotalFrames; + // Due to the packed vop, we may end up with more images + // Assume MAX_VOP Bframes maximum + odmlIndex *newIndex = new odmlIndexnbFrame+MAX_VOP; + ADM_assert(newIndex); + +#ifndef __HAIKU__ + uint32_t originalPriority = getpriority(PRIO_PROCESS, 0); +#endif #if 0 uint32_t priorityLevel; prefs->get(PRIORITY_INDEXING,&priorityLevel); setpriority(PRIO_PROCESS, 0, ADM_getNiceValue(priorityLevel)); #endif - printf("Avi Trying to unpack the stream\n"); - DIA_workingBase *working=createWorking(QT_TRANSLATE_NOOP("opendmldemuxer","Unpacking bitstream")); - ADMCompressedImage image; - image.data=buffer; - uint32_t img=0; + printf("Avi Trying to unpack the stream\n"); + + DIA_workingBase *working = createWorking(QT_TRANSLATE_NOOP("opendmldemuxer","Unpacking bitstream")); + + ADMCompressedImage image; + image.data = buffer; + uint32_t img = 0; uint32_t oldtimecode=0xffffffff; - while(img<nbFrame) - { + + while(img < nbFrame) + { ADM_assert(nbDuped<2); - working->update(img,nbFrame); - if(!getFrame(img,&image)) + working->update(img, nbFrame); + uint32_t frameSize; + getFrameSize(img, &frameSize); + if (frameSize > bufferSize) + { + ADM_error("Abnormally large unpacked frame %" PRIu32"\n", img); + goto _abortUnpack; + } + if (!getFrame(img,&image)) { printf("Avi Error could not get frame %" PRIu32"\n",img); goto _abortUnpack; } - aprintf("--Frame:%lu/%lu, len %lu, nbDuped%u\n",img,nbFrame,image.dataLength,nbDuped); + aprintf("--Frame: %lu / %lu, len %lu, nbDuped %u\n", img, nbFrame, image.dataLength, nbDuped); - if(image.dataLength<=2) - { - if(nbDuped) - { - aprintf("Skipping null frame\n"); - nbDuped--; - img++; - continue; - } - } - if(image.dataLength<6) // Too short to contain a valid vop header, just copy - { - memcpy(&newIndextargetIndex,&_idximg,sizeof(_idx0)); - aprintf("TOO SMALL\n"); - targetIndex++; - img++; - continue; - } + if (image.dataLength <= 2) + { + if (nbDuped) + { + aprintf("Skipping null frame\n"); + nbDuped--; + img++; + continue; + } + } + if (image.dataLength < 6) // Too short to contain a valid vop header, just copy + { + memcpy(&newIndextargetIndex, &_idximg, sizeof(_idx0)); + aprintf("TOO SMALL\n"); + targetIndex++; + img++; + continue; + } - nbVop = ADM_searchVop(buffer,buffer+image.dataLength,MAX_VOP,myVops,&timcincbits); + nbVop = ADM_searchVop(buffer, buffer + image.dataLength, MAX_VOP, myVops, &timcincbits); - if(!nbVop) /* Cannot find vop, corrupted or WTF ...*/ - { - printf("Avi img :%u failed to find vop!\n",img); - memcpy(&newIndextargetIndex,&_idximg,sizeof(_idx0)); - targetIndex++; - img++; - continue; + if (!nbVop) /* Cannot find vop, corrupted or WTF ...*/ + { + printf("Avi img : %u failed to find vop!\n", img); + memcpy(&newIndextargetIndex, &_idximg, sizeof(_idx0)); + targetIndex++; + img++; + continue; + } + /* We have one or more vop inside it...*/ + if (nbVop==1 && nbDuped) // only one vop, could it be an evil duplicate ? + { + if (myVops0.timeInc == oldtimecode && !myVops0.vopCoded) + { + aprintf("Frame has same timecode and is not vop coded; skipping\n"); + img++; + nbDuped--; + continue; + } + } - } - /* We have one or more vop inside it...*/ - if(nbVop==1 && nbDuped) // only one vop, could it be an evil duplicate ? - { - if(myVops0.timeInc==oldtimecode && !myVops0.vopCoded) - { - aprintf("Frame has same timecode and is not vop coded; skipping\n"); - img++; - nbDuped--; - continue; - } - } + // more than one vop, do up to the n-1th + // the 1st image starts at 0 + myVops0.offset=0; - // more than one vop, do up to the n-1th - // the 1st image starts at 0 - myVops0.offset=0; - myVopsnbVop.offset=image.dataLength; + //if(nbVop>2) + { + aprintf("At %u, %d vop!\n",img,nbVop); + } + /* The 1st one becomes our new timecode reference, a dupe will have the same timebase */ + if (myVops0.type != AVI_B_FRAME) + oldtimecode = myVops0.timeInc; - //if(nbVop>2) + for (uint32_t j=0; j < nbVop; j++) + { + if (!j) + newIndextargetIndex.intra = myVopsj.type; + else + newIndextargetIndex.intra = AVI_B_FRAME; + uint32_t sz = (j+1 < nbVop)? myVopsj+1.offset : image.dataLength; + sz -= myVopsj.offset; + newIndextargetIndex.size = sz; + newIndextargetIndex.offset = _idximg.offset + myVopsj.offset; + + if(j) + { + if (nbDuped) { - aprintf("At %u, %d vop!\n",img,nbVop); - } - /* The 1st one becomes our new timecode reference, a dupe will have the same timebase */ - if(myVops0.type!=AVI_B_FRAME) - oldtimecode=myVops0.timeInc; - - for(uint32_t j=0;j<nbVop;j++) + printf("Avi *** WARNING *** Missing one NVOP, dropping one b frame instead at image %u\n",img); + nbDuped--; + } else { - - - if(!j) - newIndextargetIndex.intra=myVopsj.type; - else - newIndextargetIndex.intra=AVI_B_FRAME; - newIndextargetIndex.size=myVopsj+1.offset-myVopsj.offset; - newIndextargetIndex.offset=_idximg.offset+myVopsj.offset; - - if(j) - { - if(nbDuped) - { - printf("Avi WARNING*************** Missing one NVOP, dropping one b frame instead at image %u\n",img); - nbDuped--; - }else - { - nbDuped++; - targetIndex++; - } - } else - { - targetIndex++; - } + nbDuped++; + targetIndex++; } + } else + { + targetIndex++; + } + } - img++; + img++; + } - } - newIndex0.intra=AVI_KEY_FRAME; // Force - ret=1; + newIndex0.intra = AVI_KEY_FRAME; // Force + ret = 1; _abortUnpack: - delete buffer; - delete working; + delete buffer; + delete working; #if 0 for(uint32_t k=0;k<nbFrame;k++) { printf("%d old:%lu new: %lu \n",_idxk.size,newIndexk.size); } #endif - if(ret==1) - { - printf("Avi Sucessfully unpacked the bitstream\n"); - - delete _idx; - _idx=newIndex; - } - else - { - delete newIndex; - printf("Avi Could not unpack this...\n"); - } - printf("Avi Initial # of images : %" PRIu32", now we have %" PRIu32" \n",nbFrame,targetIndex); - nbFrame=targetIndex; - - #ifndef __HAIKU__ - setpriority(PRIO_PROCESS, 0, originalPriority); - #endif + if (ret == 1) + { + printf("Avi Sucessfully unpacked the bitstream\n"); + delete _idx; + _idx = newIndex; + } else + { + delete newIndex; + printf("Avi Could not unpack this...\n"); + } + printf("Avi Initial # of images : %" PRIu32", now we have %" PRIu32"\n", nbFrame, targetIndex); + nbFrame = targetIndex; + +#ifndef __HAIKU__ + setpriority(PRIO_PROCESS, 0, originalPriority); +#endif - return ret; + return ret; }
View file
avidemux2-2.8.2.git20260904.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_riff.cpp -> avidemux2-2.8.2.git20260905.tar.xz/avidemux_plugins/ADM_demuxers/OpenDml/ADM_riff.cpp
Changed
@@ -41,7 +41,6 @@ } uint8_t riffParser::skip(uint32_t s) { - if(s&1) s++; fseeko(fd,s,SEEK_CUR); curPos+=s; if(curPos>endPos)
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.