The only non-pure-formatting changes are:
- Switch from `if(foo != NULL)` to `if(foo)`
- Switch from C arrays to std::array
This also moves a file-static function into the anonymous namespace
This style of formatting update would need to be done on the other files
as well before this branch is merged back to master.
This adds:
- ID3v2 versions (v3, v4): working
- Ability to create missing tags (working for ID3v2, not for DIIN)
- Ability to strip tags (incomplete)
- Some tests for these features, and other basic functionality
(incomplete)
There are still a number of major issues in the code, so I'm pushing
this out to a feature branch for now. Specifically, the structure of
the code does not closely follow the format specification (as in other
implementations) and is not internally documented, so it is very
difficult to follow.
Specifically chunk type names should follow more closely those in the
spec. Right now there is only one chunk type (whereas the spec has
several), and the notion / implementation of child chunks seems
incomplete.
Addtionally, before this is merged back to master a number of formatting
changes are needed:
- Spacing as done in the rest of TagLib
- Remove usage of NULL
- Usage of TagLib's containers instead of STL containers
- Use of std::array rather than C arrays where fixed length containers
are needed
- More complete test coverage
CC #878
This does not put the deprecated marker on methods that will or could resolve
to the same overload, e.g.:
void foo(bool bar = true); // <-- not marked
void foo(Bar bar) // <-- since this will have a default argument in the new version
This uses explicit enums for e.g. the ID3v2 version, making calls more
readable:
file.save(ID3v1 | ID3v2, StripOthers, ID3v2::v4, Duplicate);
Instead of:
file.save(ID3v1 | ID3v2, true, 4, true);
Needs to be ported to other types, per #922
This avoids stale data presented to caller via a fread()
Current bug due to the buffered data can be seen in stripping mp3s of tags
f.strip(ID3v1);
f.strip(APE);
The ID3v1 tag sits at the end of file (strip calls ftruncate()) and the APE
strip performs a readFile() that would return the stream buffered/truncated data
and reinsert
documentation/functionality across other tpyes (mp3/flac/...); m4a do not honour
this and instead sets the underlying value to 0.
This commit fixes this issue (#911)
Commit d4c938cbc766ffb400c09efb9e696fce2537d81e is about fixing taglib-config for proper cross-compilation. The fix is right in principle, but wrong about adding `CMAKE_SYSROOT`. The correct prefix path should be set outside of the config file as some embedded Linux distros like OpenWrt or OpenEmbedded install with a different DESTDIR, and dependent packages see a different sysroot.
* Respect atom type when converting rate tag
TagLib prior to #818 (commit ff28cf276c60) read and wrote the "rate" tag as
text, and switched to reading it as integer value even when the atom class
is a text type. This breaks reading existing files, and can be avoided by
taking the atom type into account.
This fixes issue #885.
* Respect MP4::Item type when writing the rate tag
TagLib prior to #818 (commit ff28cf276c60) read and wrote the "rate" tag
as text, and switched to writing the integer value of the MP4::Item.
This breaks writing from applications which supply the value as
StringList, which was the previously implemented API. Applications using
an MP4::Item(UInt) are still supported without changes on the application
side.
This is the complementary writing part for issue #885.
When parsing mp4 media header version 1 (mdhd) atoms, the timescale (unit) is parsed as a `LongLong` (8 bytes), but instead should be a `UInt` (4 bytes). This results in an incorrect timescale, and also pushes the offset of the duration (length) off by 4 bytes.
The end result being that the AudioProperties track length for mp4's with mdhd v1 comes back as 0.
See: https://wiki.multimedia.cx/index.php/QuickTime_container
| Entry | Bytes (v0) | Bytes (v1) |
| :--- | :---: | :---: |
| size | 4 | 4 |
| type | 4 | 4 |
| version | 1 | 1 |
| flags | 3 | 3 |
| creation time* | 4 | **8** |
| modification time* | 4 | **8** |
| time scale | 4 | 4 |
| duration* | 4 | **8** |
| language | 2 | 2 |
| quality | 2 | 2 |
* Add DSF and DSDIFF file types management
* Fixes for some build chains
* unit64_t replaced by unsigned long long, warning fixes
* Remove C++11 extension incompatible with some build chains (enumeration in a nested name specifier)
* Change typedef types (uint, ulong, ...) to standard types
remove BUILD_FRAMEWORK changes from this pull request
* Replace deprecated String::null and ByteVector::null by String() and ByteVector()
Styling update, thanks to FestusHagen
* Restyling
* Restyling to reduce length of excessively long lines
* Add to detectByExtension
* Added `isSupported(IOStream *stream)` to `DSF::File` and `DSDIFF::File`
CVE-2018-11439 is caused by a failure to check the minimum length
of a ogg flac header. This header is detailed in full at:
https://xiph.org/flac/ogg_mapping.html. Added more strict checking
for entire header.
If TDRC is encrypted, FrameFactory::createFrame() returns UnknownFrame
which causes problems in rebuildAggregateFrames() when it is assumed
that TDRC is a TextIdentificationFrame
powerpc is a platform with 'char' == 'unsigned char'.
As a result '-1' is not expressible in char and build fails as:
```
# '-funsigned-char' to force test build failure on other platforms
$ cmake .. -DBUILD_TESTS=YES -DCMAKE_CXX_FLAGS="-O2 -funsigned-char" -DCMAKE_C_FLAGS="-O2 -funsigned-char"
...
$ make check
tests/test_synchdata.cpp: In member function 'void TestID3v2SynchData::testToUIntBroken()':
tests/test_synchdata.cpp:78:33: error: narrowing conversion of '-1' from 'int' to 'char' inside { } [-Wnarrowing]
char data[] = { 0, 0, 0, -1 };
^
```
The fix is to expliticly cast -1 to 'char'.
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>