Merge commit '062cd5a975ff7bd6fb91f9b4d1d9d102a7545499'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 19 Feb 2015 20:44:58 +0000 (21:44 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 19 Feb 2015 20:44:58 +0000 (21:44 +0100)
* commit '062cd5a975ff7bd6fb91f9b4d1d9d102a7545499':
  lavf: Add DSS demuxer

Conflicts:
libavformat/Makefile
libavformat/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
doc/general.texi
libavformat/Makefile
libavformat/allformats.c
libavformat/dss.c
libavformat/version.h

diff --cc Changelog
+++ b/Changelog
@@@ -31,324 -15,150 +31,324 @@@ version <next>
  - DXVA2-accelerated HEVC decoding
  - AAC ELD 480 decoding
  - Intel QSV-accelerated H.264 decoding
- - DSS SP decoder
+ - DSS SP decoder and DSS demuxer
  
 +version 2.5:
 +- HEVC/H.265 RTP payload format (draft v6) packetizer
 +- SUP/PGS subtitle demuxer
 +- ffprobe -show_pixel_formats option
 +- CAST128 symmetric block cipher, ECB mode
 +- STL subtitle demuxer and decoder
 +- libutvideo YUV 4:2:2 10bit support
 +- XCB-based screen-grabber
 +- UDP-Lite support (RFC 3828)
 +- xBR scaling filter
 +- AVFoundation screen capturing support
 +- ffserver supports codec private options
 +- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
 +- WebP muxer with animated WebP support
 +- zygoaudio decoding support
 +- APNG demuxer
 +- postproc visualization support
  
 -version 11:
 -- libx265 encoder
 +
 +version 2.4:
 +- Icecast protocol
 +- ported lenscorrection filter from frei0r filter
 +- large optimizations in dctdnoiz to make it usable
 +- ICY metadata are now requested by default with the HTTP protocol
 +- support for using metadata in stream specifiers in fftools
 +- LZMA compression support in TIFF decoder
 +- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer
 +- HEVC/H.265 RTP payload format (draft v6) depacketizer
 +- added codecview filter to visualize information exported by some codecs
 +- Matroska 3D support thorugh side data
 +- HTML generation using texi2html is deprecated in favor of makeinfo/texi2any
 +- silenceremove filter
 +
 +
 +version 2.3:
 +- AC3 fixed-point decoding
  - shuffleplanes filter
 +- subfile protocol
 +- Phantom Cine demuxer
  - replaygain data export
 +- VP7 video decoder
  - Alias PIX image encoder and decoder
 -- BRender PIX image decoder
 -- Amazing Studio PAF playback support
 -- XBM decoder
 -- BMP standalone parser
 -- OpenEXR image decoder
 -- support encoding and decoding 4-channel SGI images
 +- Improvements to the BRender PIX image decoder
 +- Improvements to the XBM decoder
 +- QTKit input device
 +- improvements to OpenEXR image decoder
  - support decoding 16-bit RLE SGI images
 -- VP7 video decoder
 -- LucasArts SMUSH SANM video decoder
 -- LucasArts SMUSH VIMA audio decoder (ADPCM)
 -- LucasArts SMUSH demuxer
 -- MP2 encoding via TwoLAME
 -- asettb filter
 -- Silicon Graphics RLE 8-bit video decoder
 -- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 -- Silicon Graphics Movie demuxer
 +- GDI screen grabbing for Windows
 +- alternative rendition support for HTTP Live Streaming
 +- AVFoundation input device
 +- Direct Stream Digital (DSD) decoder
 +- Magic Lantern Video (MLV) demuxer
  - On2 AVC (Audio for Video) decoder
 -- support for decoding through DXVA2 in avconv
 +- support for decoding through DXVA2 in ffmpeg
  - libbs2b-based stereo-to-binaural audio filter
 +- libx264 reference frames count limiting depending on level
  - native Opus decoder
  - display matrix export and rotation API
 -- drop avserver, it was unmaintained for years and largely broken
 -- Icecast protocol
 -- request Icecast metadata by default
 -- support for using metadata in stream specifiers in avtools
 -- Matroska 3D support
 +- WebVTT encoder
 +- showcqt multimedia filter
 +- zoompan filter
 +- signalstats filter
 +- hqx filter (hq2x, hq3x, hq4x)
 +- flanger filter
 +- Image format auto-detection
 +- LRC demuxer and muxer
 +- Samba protocol (via libsmbclient)
 +- WebM DASH Manifest muxer
 +- libfribidi support in drawtext
  
  
 -version 10:
 -- av_strnstr
 -- support ID3v2 tags in ASF files
 +version 2.2:
 +
 +- HNM version 4 demuxer and video decoder
 +- Live HDS muxer
 +- setsar/setdar filters now support variables in ratio expressions
 +- elbg filter
 +- string validation in ffprobe
 +- support for decoding through VDPAU in ffmpeg (the -hwaccel option)
 +- complete Voxware MetaSound decoder
 +- remove mp3_header_compress bitstream filter
 +- Windows resource files for shared libraries
 +- aeval filter
 +- stereoscopic 3d metadata handling
 +- WebP encoding via libwebp
 +- ATRAC3+ decoder
 +- VP8 in Ogg demuxing
 +- side & metadata support in NUT
 +- framepack filter
 +- XYZ12 rawvideo support in NUT
 +- Exif metadata support in WebP decoder
 +- OpenGL device
 +- Use metadata_header_padding to control padding in ID3 tags (currently used in
 +  MP3, AIFF, and OMA files), FLAC header, and the AVI "junk" block.
 +- Mirillis FIC video decoder
 +- Support DNx444
 +- libx265 encoder
 +- dejudder filter
 +- Autodetect VDA like all other hardware accelerations
 +- aliases and defaults for Ogg subtypes (opus, spx)
 +
 +
 +version 2.1:
 +
 +- aecho filter
 +- perspective filter ported from libmpcodecs
 +- ffprobe -show_programs option
 +- compand filter
 +- RTMP seek support
 +- when transcoding with ffmpeg (i.e. not streamcopying), -ss is now accurate
 +  even when used as an input option. Previous behavior can be restored with
 +  the -noaccurate_seek option.
 +- ffmpeg -t option can now be used for inputs, to limit the duration of
 +  data read from an input file
 +- incomplete Voxware MetaSound decoder
 +- read EXIF metadata from JPEG
 +- DVB teletext decoder
 +- phase filter ported from libmpcodecs
 +- w3fdif filter
 +- Opus support in Matroska
 +- FFV1 version 1.3 is stable and no longer experimental
 +- FFV1: YUVA(444,422,420) 9, 10 and 16 bit support
 +- changed DTS stream id in lavf mpeg ps muxer from 0x8a to 0x88, to be
 +  more consistent with other muxers.
 +- adelay filter
 +- pullup filter ported from libmpcodecs
 +- ffprobe -read_intervals option
 +- Lossless and alpha support for WebP decoder
 +- Error Resilient AAC syntax (ER AAC LC) decoding
 +- Low Delay AAC (ER AAC LD) decoding
 +- mux chapters in ASF files
 +- SFTP protocol (via libssh)
 +- libx264: add ability to encode in YUVJ422P and YUVJ444P
 +- Fraps: use BT.709 colorspace by default for yuv, as reference fraps decoder does
 +- make decoding alpha optional for prores, ffv1 and vp6 by setting
 +  the skip_alpha flag.
 +- ladspa wrapper filter
 +- native VP9 decoder
 +- dpx parser
 +- max_error_rate parameter in ffmpeg
 +- PulseAudio output device
 +- ReplayGain scanner
 +- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support)
 +- Linux framebuffer output device
 +- HEVC decoder
 +- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing
 +- mergeplanes filter
 +
 +
 +version 2.0:
 +
 +- curves filter
  - reference-counting for AVFrame and AVPacket data
 -- avconv now fails when input options are used for output file
 +- ffmpeg now fails when input options are used for output file
    or vice versa
 -- avconv options -filter_script and -filter_complex_script, which allow a
 +- support for Monkey's Audio versions from 3.93
 +- perms and aperms filters
 +- audio filtering support in ffplay
 +- 10% faster aac encoding on x86 and MIPS
 +- sine audio filter source
 +- WebP demuxing and decoding support
 +- ffmpeg options -filter_script and -filter_complex_script, which allow a
    filtergraph description to be read from a file
 +- OpenCL support
 +- audio phaser filter
 +- separatefields filter
 +- libquvi demuxer
  - uniform options syntax across all filters
 +- telecine filter
  - interlace filter
 -- JPEG 2000 decoder
 -- asetpts filter (same as setpts, but for audio)
 +- smptehdbars source
 +- inverse telecine filters (fieldmatch and decimate)
 +- colorbalance filter
 +- colorchannelmixer filter
 +- The matroska demuxer can now output proper verbatim ASS packets. It will
 +  become the default at the next libavformat major bump.
 +- decent native animated GIF encoding
 +- asetrate filter
 +- interleave filter
 +- timeline editing with filters
 +- vidstabdetect and vidstabtransform filters for video stabilization using
 +  the vid.stab library
 +- astats filter
  - trim and atrim filters
 -- avconv -t and -ss (output-only) options are now sample-accurate when
 +- ffmpeg -t and -ss (output-only) options are now sample-accurate when
    transcoding audio
  - Matroska muxer can now put the index at the beginning of the file.
 -- avconv -deinterlace option removed, the yadif filter should be used instead
 +- extractplanes filter
 +- avectorscope filter
 +- ADPCM DTK decoder
 +- ADP demuxer
 +- RSD demuxer
 +- RedSpark demuxer
 +- ADPCM IMA Radical decoder
 +- zmq filters
 +- DCT denoiser filter (dctdnoiz)
 +- Wavelet denoiser filter ported from libmpcodecs as owdenoise (formerly "ow")
  - Apple Intermediate Codec decoder
  - Escape 130 video decoder
 +- FTP protocol support
 +- V4L2 output device
 +- 3D LUT filter (lut3d)
 +- SMPTE 302M audio encoder
  - support for slice multithreading in libavfilter
 +- Hald CLUT support (generation and filtering)
  - VC-1 interlaced B-frame support
  - support for WavPack muxing (raw and in Matroska)
 +- XVideo output device
 +- vignette filter
 +- True Audio (TTA) encoder
  - Go2Webinar decoder
 +- mcdeint filter ported from libmpcodecs
 +- sab filter ported from libmpcodecs
 +- ffprobe -show_chapters option
  - WavPack encoding through libwavpack
 -- Added the -n parameter to avconv
 -- RTMP seek support
 -- when transcoding with avconv (i.e. not streamcopying), -ss is now accurate
 -  even when used as an input option. Previous behavior can be restored with
 -  the -noaccurate_seek option.
 -- avconv -t option can now be used for inputs, to limit the duration of
 -  data read from an input file
 -- Voxware MetaSound decoder
 -- WebP decoder
 -- Error Resilient AAC syntax (ER AAC LC) decoding
 -- Low Delay AAC (ER AAC LD) decoding
 -- mux chapters in ASF files
 -- Opus in Ogg demuxing
 -- Enhanced Low Delay AAC (ER AAC ELD) decoding (no LD SBR support)
 -- F4V muxer
 -- HNM version 4 demuxer and video decoder
 -- HEVC decoder
 -- raw HEVC, HEVC in MOV/MP4, HEVC in Matroska, HEVC in MPEG-TS demuxing
 -- remove avplay -vismv option, which has not worked for a long time
 -- Live HDS muxer
 -- setsar/setdar filters now support variables in ratio expressions
 -- dar variable in the scale filter now returns the actual DAR (i.e. a * sar)
 -- VP9 decoder
 -- support for decoding through VDPAU in avconv (the -hwaccel option)
 -- remove mp3_header_(de)compress bitstream filters
 -- stereoscopic 3d metadata handling
 -- png standalone parser
 -- WebP encoding via libwebp
 -- ATRAC3+ decoder
 -- framepack filter
 -- Mirillis FIC video decoder
 -- Support DNx444
 -- compand audio filter
 +- rotate filter
 +- spp filter ported from libmpcodecs
 +- libgme support
 +- psnr filter
  
  
 -version 9:
 -- av_basename and av_dirname
 -- adobe and limelight publisher authentication in RTMP
 +version 1.2:
 +
  - VDPAU hardware acceleration through normal hwaccel
  - SRTP support
 +- Error diffusion dither in Swscale
 +- Chained Ogg support
 +- Theora Midstream reconfiguration support
 +- EVRC decoder
 +- audio fade filter
 +- filtering audio with unknown channel layout
 +- allpass, bass, bandpass, bandreject, biquad, equalizer, highpass, lowpass
 +  and treble audio filter
 +- improved showspectrum filter, with multichannel support and sox-like colors
 +- histogram filter
 +- tee muxer
 +- il filter ported from libmpcodecs
 +- support ID3v2 tags in ASF files
 +- encrypted TTA stream decoding support
 +- RF64 support in WAV muxer
 +- noise filter ported from libmpcodecs
 +- Subtitles character encoding conversion
 +- blend filter
 +- stereo3d filter ported from libmpcodecs
 +
  
 +version 1.1:
  
 -version 9_beta3:
 -- ashowinfo audio filter
 +- stream disposition information printing in ffprobe
 +- filter for loudness analysis following EBU R128
 +- Opus encoder using libopus
 +- ffprobe -select_streams option
 +- Pinnacle TARGA CineWave YUV16 decoder
 +- TAK demuxer, decoder and parser
 +- DTS-HD demuxer
 +- remove -same_quant, it hasn't worked for years
 +- FFM2 support
 +- X-Face image encoder and decoder
  - 24-bit FLAC encoding
 -- audio volume filter
 -- deprecated the avconv -vol option. the volume filter is to be used instead.
  - multi-channel ALAC encoding up to 7.1
 -- TAK demuxer, parser, and decoder
 -- adaptive frame-level multithreading for H.264
 -
 -
 -version 9_beta2:
  - metadata (INFO tag) support in WAV muxer
 +- subtitles raw text decoder
  - support for building DLLs using MSVC
 -- remove avserver daemon mode
 +- LVF demuxer
 +- ffescape tool
 +- metadata (info chunk) support in CAF muxer
 +- field filter ported from libmpcodecs
 +- AVR demuxer
 +- geq filter ported from libmpcodecs
 +- remove ffserver daemon mode
 +- AST muxer/demuxer
 +- new expansion syntax for drawtext
 +- BRender PIX image decoder
 +- ffprobe -show_entries option
 +- ffprobe -sections option
 +- ADPCM IMA Dialogic decoder
 +- BRSTM demuxer
 +- animated GIF decoder and demuxer
 +- PVF demuxer
 +- subtitles filter
 +- IRCAM muxer/demuxer
 +- Paris Audio File demuxer
 +- Virtual concatenation demuxer
 +- VobSub demuxer
 +- JSON captions for TED talks decoding support
 +- SOX Resampler support in libswresample
 +- aselect filter
 +- SGI RLE 8-bit / Silicon Graphics RLE 8-bit video decoder
 +- Silicon Graphics Motion Video Compressor 1 & 2 decoder
 +- Silicon Graphics Movie demuxer
 +- apad filter
 +- Resolution & pixel format change support with multithreading for H.264
 +- documentation split into per-component manuals
 +- pp (postproc) filter ported from MPlayer
 +- NIST Sphere demuxer
 +- MPL2, VPlayer, MPlayer, AQTitle, PJS and SubViewer v1 subtitles demuxers and decoders
 +- Sony Wave64 muxer
 +- adobe and limelight publisher authentication in RTMP
 +- data: URI scheme
  - support building on the Plan 9 operating system
 -- ffv1: support version 1.3
 +- kerndeint filter ported from MPlayer
 +- histeq filter ported from VirtualDub
 +- Megalux Frame demuxer
 +- 012v decoder
 +- Improved AVC Intra decoding support
  
  
 -version 9_beta1:
 +version 1.0:
  
 -- XWD encoder and decoder
 -- Support for fragmentation in the mov/mp4 muxer
 -- ISMV (Smooth Streaming) muxer
 -- CDXL demuxer and decoder
 -- Apple ProRes encoder
 -- Sun Rasterfile Encoder
 -- remove libpostproc
 -- ID3v2 attached pictures reading and writing
 -- WMA Lossless decoder
 -- XBM encoder
 -- RealAudio Lossless decoder
 -- ZeroCodec decoder
 -- drop support for avconv without libavfilter
 -- add libavresample audio conversion library
 -- audio filters support in libavfilter and avconv
 -- add fps filter
 -- audio split filter
 -- audio mix filter
 -- avprobe output is now standard INI or JSON. The old format can still
 -  be used with -of old.
 +- INI and flat output in ffprobe
 +- Scene detection in libavfilter
  - Indeo Audio decoder
  - channelsplit audio filter
 +- setnsamples audio filter
 +- atempo filter
 +- ffprobe -show_data option
  - RTMPT protocol support
  - iLBC encoding/decoding via libilbc
  - Microsoft Screen 1 decoder
@@@ -252,12 -221,12 +252,13 @@@ library
      @tab Used in the game Cyberia from Interplay.
  @item Delphine Software International CIN @tab   @tab X
      @tab Multimedia format used by Delphine Software games.
+ @item Digital Speech Standard (DSS) @tab   @tab X
  @item CD+G                      @tab   @tab X
      @tab Video format used by CD+G karaoke disks
 +@item Phantom Cine              @tab   @tab X
  @item Commodore CDXL            @tab   @tab X
      @tab Amiga CD video format
 -@item Core Audio Format         @tab   @tab X
 +@item Core Audio Format         @tab X @tab X
      @tab Apple Core Audio Format
  @item CRC testing format        @tab X @tab
  @item Creative Voice            @tab X @tab X
@@@ -125,9 -99,8 +125,10 @@@ OBJS-$(CONFIG_DIRAC_DEMUXER
  OBJS-$(CONFIG_DIRAC_MUXER)               += rawenc.o
  OBJS-$(CONFIG_DNXHD_DEMUXER)             += dnxhddec.o rawdec.o
  OBJS-$(CONFIG_DNXHD_MUXER)               += rawenc.o
 +OBJS-$(CONFIG_DSF_DEMUXER)               += dsfdec.o
  OBJS-$(CONFIG_DSICIN_DEMUXER)            += dsicin.o
+ OBJS-$(CONFIG_DSS_DEMUXER)               += dss.o
 +OBJS-$(CONFIG_DTSHD_DEMUXER)             += dtshddec.o
  OBJS-$(CONFIG_DTS_DEMUXER)               += dtsdec.o rawdec.o
  OBJS-$(CONFIG_DTS_MUXER)                 += rawenc.o
  OBJS-$(CONFIG_DV_DEMUXER)                += dv.o
@@@ -108,12 -93,10 +108,13 @@@ void av_register_all(void
      REGISTER_DEMUXER (DFA,              dfa);
      REGISTER_MUXDEMUX(DIRAC,            dirac);
      REGISTER_MUXDEMUX(DNXHD,            dnxhd);
 +    REGISTER_DEMUXER (DSF,              dsf);
      REGISTER_DEMUXER (DSICIN,           dsicin);
+     REGISTER_DEMUXER (DSS,              dss);
      REGISTER_MUXDEMUX(DTS,              dts);
 +    REGISTER_DEMUXER (DTSHD,            dtshd);
      REGISTER_MUXDEMUX(DV,               dv);
 +    REGISTER_DEMUXER (DVBSUB,           dvbsub);
      REGISTER_DEMUXER (DXA,              dxa);
      REGISTER_DEMUXER (EA,               ea);
      REGISTER_DEMUXER (EA_CDATA,         ea_cdata);
index 0000000,f7d0ead..f4355f1
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,342 +1,342 @@@
 - * This file is part of Libav.
+ /*
+  * Digital Speech Standard (DSS) demuxer
+  * Copyright (c) 2014 Oleksij Rempel <linux@rempel-privat.de>
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include "libavutil/attributes.h"
+ #include "libavutil/bswap.h"
+ #include "libavutil/channel_layout.h"
+ #include "libavutil/intreadwrite.h"
+ #include "avformat.h"
+ #include "internal.h"
+ #define DSS_HEAD_OFFSET_AUTHOR        0xc
+ #define DSS_AUTHOR_SIZE               16
+ #define DSS_HEAD_OFFSET_START_TIME    0x26
+ #define DSS_HEAD_OFFSET_END_TIME      0x32
+ #define DSS_TIME_SIZE                 12
+ #define DSS_HEAD_OFFSET_ACODEC        0x2a4
+ #define DSS_ACODEC_DSS_SP             0x0    /* SP mode */
+ #define DSS_ACODEC_G723_1             0x2    /* LP mode */
+ #define DSS_HEAD_OFFSET_COMMENT       0x31e
+ #define DSS_COMMENT_SIZE              64
+ #define DSS_BLOCK_SIZE                512
+ #define DSS_HEADER_SIZE              (DSS_BLOCK_SIZE * 2)
+ #define DSS_AUDIO_BLOCK_HEADER_SIZE   6
+ #define DSS_FRAME_SIZE                42
+ static const uint8_t frame_size[4] = { 24, 20, 4, 1 };
+ typedef struct DSSDemuxContext {
+     unsigned int audio_codec;
+     int counter;
+     int swap;
+     int dss_sp_swap_byte;
+     int8_t *dss_sp_buf;
+ } DSSDemuxContext;
+ static int dss_probe(AVProbeData *p)
+ {
+     if (AV_RL32(p->buf) != MKTAG(0x2, 'd', 's', 's'))
+         return 0;
+     return AVPROBE_SCORE_MAX;
+ }
+ static int dss_read_metadata_date(AVFormatContext *s, unsigned int offset,
+                                   const char *key)
+ {
+     AVIOContext *pb = s->pb;
+     char datetime[64], string[DSS_TIME_SIZE + 1] = { 0 };
+     int y, month, d, h, minute, sec;
+     int ret;
+     avio_seek(pb, offset, SEEK_SET);
+     ret = avio_read(s->pb, string, DSS_TIME_SIZE);
+     if (ret < DSS_TIME_SIZE)
+         return ret < 0 ? ret : AVERROR_EOF;
+     sscanf(string, "%2d%2d%2d%2d%2d%2d", &y, &month, &d, &h, &minute, &sec);
+     /* We deal with a two-digit year here, so set the default date to 2000
+      * and hope it will never be used in the next century. */
+     snprintf(datetime, sizeof(datetime), "%.4d-%.2d-%.2dT%.2d:%.2d:%.2d",
+              y + 2000, month, d, h, minute, sec);
+     return av_dict_set(&s->metadata, key, datetime, 0);
+ }
+ static int dss_read_metadata_string(AVFormatContext *s, unsigned int offset,
+                                     unsigned int size, const char *key)
+ {
+     AVIOContext *pb = s->pb;
+     char *value;
+     int ret;
+     avio_seek(pb, offset, SEEK_SET);
+     value = av_mallocz(size + 1);
+     if (!value)
+         return AVERROR(ENOMEM);
+     ret = avio_read(s->pb, value, size);
+     if (ret < size) {
+         ret = ret < 0 ? ret : AVERROR_EOF;
+         goto exit;
+     }
+     ret = av_dict_set(&s->metadata, key, value, 0);
+ exit:
+     av_free(value);
+     return ret;
+ }
+ static int dss_read_header(AVFormatContext *s)
+ {
+     DSSDemuxContext *ctx = s->priv_data;
+     AVIOContext *pb = s->pb;
+     AVStream *st;
+     int ret;
+     st = avformat_new_stream(s, NULL);
+     if (!st)
+         return AVERROR(ENOMEM);
+     ret = dss_read_metadata_string(s, DSS_HEAD_OFFSET_AUTHOR,
+                                    DSS_AUTHOR_SIZE, "author");
+     if (ret)
+         return ret;
+     ret = dss_read_metadata_date(s, DSS_HEAD_OFFSET_END_TIME, "date");
+     if (ret)
+         return ret;
+     ret = dss_read_metadata_string(s, DSS_HEAD_OFFSET_COMMENT,
+                                    DSS_COMMENT_SIZE, "comment");
+     if (ret)
+         return ret;
+     avio_seek(pb, DSS_HEAD_OFFSET_ACODEC, SEEK_SET);
+     ctx->audio_codec = avio_r8(pb);
+     if (ctx->audio_codec == DSS_ACODEC_DSS_SP) {
+         st->codec->codec_id    = AV_CODEC_ID_DSS_SP;
+         st->codec->sample_rate = 12000;
+     } else if (ctx->audio_codec == DSS_ACODEC_G723_1) {
+         st->codec->codec_id    = AV_CODEC_ID_G723_1;
+         st->codec->sample_rate = 8000;
+     } else {
+         avpriv_request_sample(s, "Support for codec %x in DSS",
+                               ctx->audio_codec);
+         return AVERROR_PATCHWELCOME;
+     }
+     st->codec->codec_type     = AVMEDIA_TYPE_AUDIO;
+     st->codec->channel_layout = AV_CH_LAYOUT_MONO;
+     st->codec->channels       = 1;
+     avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+     st->start_time = 0;
+     /* Jump over header */
+     if (avio_seek(pb, DSS_HEADER_SIZE, SEEK_SET) != DSS_HEADER_SIZE)
+         return AVERROR(EIO);
+     ctx->counter = 0;
+     ctx->swap    = 0;
+     ctx->dss_sp_buf = av_malloc(DSS_FRAME_SIZE + 1);
+     if (!ctx->dss_sp_buf)
+         return AVERROR(ENOMEM);
+     return 0;
+ }
+ static void dss_skip_audio_header(AVFormatContext *s, AVPacket *pkt)
+ {
+     DSSDemuxContext *ctx = s->priv_data;
+     AVIOContext *pb = s->pb;
+     avio_skip(pb, DSS_AUDIO_BLOCK_HEADER_SIZE);
+     ctx->counter += DSS_BLOCK_SIZE - DSS_AUDIO_BLOCK_HEADER_SIZE;
+ }
+ static void dss_sp_byte_swap(DSSDemuxContext *ctx,
+                              uint8_t *dst, const uint8_t *src)
+ {
+     int i;
+     if (ctx->swap) {
+         for (i = 3; i < DSS_FRAME_SIZE; i += 2)
+             dst[i] = src[i];
+         for (i = 0; i < DSS_FRAME_SIZE - 2; i += 2)
+             dst[i] = src[i + 4];
+         dst[1] = ctx->dss_sp_swap_byte;
+     } else {
+         memcpy(dst, src, DSS_FRAME_SIZE);
+         ctx->dss_sp_swap_byte = src[DSS_FRAME_SIZE - 2];
+     }
+     /* make sure byte 40 is always 0 */
+     dst[DSS_FRAME_SIZE - 2] = 0;
+     ctx->swap             ^= 1;
+ }
+ static int dss_sp_read_packet(AVFormatContext *s, AVPacket *pkt)
+ {
+     DSSDemuxContext *ctx = s->priv_data;
+     int read_size, ret, offset = 0, buff_offset = 0;
+     if (ctx->counter == 0)
+         dss_skip_audio_header(s, pkt);
+     pkt->pos = avio_tell(s->pb);
+     if (ctx->swap) {
+         read_size   = DSS_FRAME_SIZE - 2;
+         buff_offset = 3;
+     } else
+         read_size = DSS_FRAME_SIZE;
+     ctx->counter -= read_size;
+     ret = av_new_packet(pkt, DSS_FRAME_SIZE);
+     if (ret < 0)
+         return ret;
+     pkt->duration     = 0;
+     pkt->stream_index = 0;
+     if (ctx->counter < 0) {
+         int size2 = ctx->counter + read_size;
+         ret = avio_read(s->pb, ctx->dss_sp_buf + offset + buff_offset,
+                         size2 - offset);
+         if (ret < size2 - offset)
+             goto error_eof;
+         dss_skip_audio_header(s, pkt);
+         offset = size2;
+     }
+     ret = avio_read(s->pb, ctx->dss_sp_buf + offset + buff_offset,
+                     read_size - offset);
+     if (ret < read_size - offset)
+         goto error_eof;
+     dss_sp_byte_swap(ctx, pkt->data, ctx->dss_sp_buf);
+     if (pkt->data[0] == 0xff)
+         return AVERROR_INVALIDDATA;
+     return pkt->size;
+ error_eof:
+     av_free_packet(pkt);
+     return ret < 0 ? ret : AVERROR_EOF;
+ }
+ static int dss_723_1_read_packet(AVFormatContext *s, AVPacket *pkt)
+ {
+     DSSDemuxContext *ctx = s->priv_data;
+     int size, byte, ret, offset;
+     if (ctx->counter == 0)
+         dss_skip_audio_header(s, pkt);
+     pkt->pos = avio_tell(s->pb);
+     /* We make one byte-step here. Don't forget to add offset. */
+     byte = avio_r8(s->pb);
+     if (byte == 0xff)
+         return AVERROR_INVALIDDATA;
+     size = frame_size[byte & 3];
+     ctx->counter -= size;
+     ret = av_new_packet(pkt, size);
+     if (ret < 0)
+         return ret;
+     pkt->data[0]  = byte;
+     offset        = 1;
+     pkt->duration = 240;
+     pkt->stream_index = 0;
+     if (ctx->counter < 0) {
+         int size2 = ctx->counter + size;
+         ret = avio_read(s->pb, pkt->data + offset,
+                         size2 - offset);
+         if (ret < size2 - offset) {
+             av_free_packet(pkt);
+             return ret < 0 ? ret : AVERROR_EOF;
+         }
+         dss_skip_audio_header(s, pkt);
+         offset = size2;
+     }
+     ret = avio_read(s->pb, pkt->data + offset, size - offset);
+     if (ret < size - offset) {
+         av_free_packet(pkt);
+         return ret < 0 ? ret : AVERROR_EOF;
+     }
+     return pkt->size;
+ }
+ static int dss_read_packet(AVFormatContext *s, AVPacket *pkt)
+ {
+     DSSDemuxContext *ctx = s->priv_data;
+     if (ctx->audio_codec == DSS_ACODEC_DSS_SP)
+         return dss_sp_read_packet(s, pkt);
+     else
+         return dss_723_1_read_packet(s, pkt);
+ }
+ static int dss_read_close(AVFormatContext *s)
+ {
+     DSSDemuxContext *ctx = s->priv_data;
+     av_free(ctx->dss_sp_buf);
+     return 0;
+ }
+ AVInputFormat ff_dss_demuxer = {
+     .name           = "dss",
+     .long_name      = NULL_IF_CONFIG_SMALL("Digital Speech Standard (DSS)"),
+     .priv_data_size = sizeof(DSSDemuxContext),
+     .read_probe     = dss_probe,
+     .read_header    = dss_read_header,
+     .read_packet    = dss_read_packet,
+     .read_close     = dss_read_close,
+     .extensions     = "dss"
+ };
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/version.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 56
- #define LIBAVFORMAT_VERSION_MINOR  22
 -#define LIBAVFORMAT_VERSION_MINOR 12
 -#define LIBAVFORMAT_VERSION_MICRO  0
++#define LIBAVFORMAT_VERSION_MINOR  23
 +#define LIBAVFORMAT_VERSION_MICRO 100
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \