Skip to content

Commit

Permalink
Merge pull request #397 from jellyfin/dtsx
Browse files Browse the repository at this point in the history
Add detection of DTS:X and DTS:X IMAX
  • Loading branch information
nyanmisaka authored Jun 8, 2024
2 parents eef3ccf + 89d1dc3 commit 42c9269
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 0 deletions.
128 changes: 128 additions & 0 deletions debian/patches/0077-add-detection-of-dtsx.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
Index: jellyfin-ffmpeg/libavcodec/avcodec.h
===================================================================
--- jellyfin-ffmpeg.orig/libavcodec/avcodec.h
+++ jellyfin-ffmpeg/libavcodec/avcodec.h
@@ -1584,12 +1584,14 @@ typedef struct AVCodecContext {
#define FF_PROFILE_DNXHR_HQX 4
#define FF_PROFILE_DNXHR_444 5

-#define FF_PROFILE_DTS 20
-#define FF_PROFILE_DTS_ES 30
-#define FF_PROFILE_DTS_96_24 40
-#define FF_PROFILE_DTS_HD_HRA 50
-#define FF_PROFILE_DTS_HD_MA 60
-#define FF_PROFILE_DTS_EXPRESS 70
+#define FF_PROFILE_DTS 20
+#define FF_PROFILE_DTS_ES 30
+#define FF_PROFILE_DTS_96_24 40
+#define FF_PROFILE_DTS_HD_HRA 50
+#define FF_PROFILE_DTS_HD_MA 60
+#define FF_PROFILE_DTS_EXPRESS 70
+#define FF_PROFILE_DTS_HD_MA_X 61
+#define FF_PROFILE_DTS_HD_MA_X_IMAX 62

#define FF_PROFILE_MPEG2_422 0
#define FF_PROFILE_MPEG2_HIGH 1
Index: jellyfin-ffmpeg/libavcodec/dca_syncwords.h
===================================================================
--- jellyfin-ffmpeg.orig/libavcodec/dca_syncwords.h
+++ jellyfin-ffmpeg/libavcodec/dca_syncwords.h
@@ -33,4 +33,7 @@
#define DCA_SYNCWORD_SUBSTREAM_CORE 0x02B09261U
#define DCA_SYNCWORD_REV1AUX 0x9A1105A0U

+#define DCA_SYNCWORD_XLL_X 0x02000850U
+#define DCA_SYNCWORD_XLL_X_IMAX 0xF14000D0U
+
#endif /* AVCODEC_DCA_SYNCWORDS_H */
Index: jellyfin-ffmpeg/libavcodec/dca_xll.c
===================================================================
--- jellyfin-ffmpeg.orig/libavcodec/dca_xll.c
+++ jellyfin-ffmpeg/libavcodec/dca_xll.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

+#include "avcodec.h"
#include "libavutil/channel_layout.h"
#include "dcadec.h"
#include "dcadata.h"
@@ -1054,6 +1055,22 @@ static int parse_frame(DCAXllDecoder *s,
return ret;
if ((ret = parse_band_data(s)) < 0)
return ret;
+
+ if (s->frame_size * 8 > FFALIGN(get_bits_count(&s->gb), 32)) {
+ unsigned int extradata_syncword;
+
+ // Align to dword
+ skip_bits_long(&s->gb, -get_bits_count(&s->gb) & 31);
+
+ extradata_syncword = show_bits_long(&s->gb, 32);
+
+ if (extradata_syncword == DCA_SYNCWORD_XLL_X) {
+ s->x_syncword_present = 1;
+ } else if ((extradata_syncword >> 1) == (DCA_SYNCWORD_XLL_X_IMAX >> 1)) {
+ s->x_imax_syncword_present = 1;
+ }
+ }
+
if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) {
av_log(s->avctx, AV_LOG_ERROR, "Read past end of XLL frame\n");
return AVERROR_INVALIDDATA;
@@ -1428,8 +1445,15 @@ int ff_dca_xll_filter_frame(DCAXllDecode
return AVERROR(EINVAL);
}

+ if (s->x_imax_syncword_present) {
+ avctx->profile = FF_PROFILE_DTS_HD_MA_X_IMAX;
+ } else if (s->x_syncword_present) {
+ avctx->profile = FF_PROFILE_DTS_HD_MA_X;
+ } else {
+ avctx->profile = FF_PROFILE_DTS_HD_MA;
+ }
+
avctx->bits_per_raw_sample = p->storage_bit_res;
- avctx->profile = FF_PROFILE_DTS_HD_MA;
avctx->bit_rate = 0;

frame->nb_samples = nsamples = s->nframesamples << (s->nfreqbands - 1);
Index: jellyfin-ffmpeg/libavcodec/dca_xll.h
===================================================================
--- jellyfin-ffmpeg.orig/libavcodec/dca_xll.h
+++ jellyfin-ffmpeg/libavcodec/dca_xll.h
@@ -135,6 +135,9 @@ typedef struct DCAXllDecoder {

DCADSPContext *dcadsp;

+ int x_syncword_present; ///< Syncword for extension data at end of frame (DTS:X) is present
+ int x_imax_syncword_present; ///< Syncword for extension data at end of frame (DTS:X IMAX) is present
+
int output_mask;
int32_t *output_samples[DCA_SPEAKER_COUNT];
} DCAXllDecoder;
Index: jellyfin-ffmpeg/libavcodec/profiles.c
===================================================================
--- jellyfin-ffmpeg.orig/libavcodec/profiles.c
+++ jellyfin-ffmpeg/libavcodec/profiles.c
@@ -36,12 +36,14 @@ const AVProfile ff_aac_profiles[] = {
};

const AVProfile ff_dca_profiles[] = {
- { FF_PROFILE_DTS, "DTS" },
- { FF_PROFILE_DTS_ES, "DTS-ES" },
- { FF_PROFILE_DTS_96_24, "DTS 96/24" },
- { FF_PROFILE_DTS_HD_HRA, "DTS-HD HRA" },
- { FF_PROFILE_DTS_HD_MA, "DTS-HD MA" },
- { FF_PROFILE_DTS_EXPRESS, "DTS Express" },
+ { FF_PROFILE_DTS, "DTS" },
+ { FF_PROFILE_DTS_ES, "DTS-ES" },
+ { FF_PROFILE_DTS_96_24, "DTS 96/24" },
+ { FF_PROFILE_DTS_HD_HRA, "DTS-HD HRA" },
+ { FF_PROFILE_DTS_HD_MA, "DTS-HD MA" },
+ { FF_PROFILE_DTS_HD_MA_X, "DTS-HD MA + DTS:X" },
+ { FF_PROFILE_DTS_HD_MA_X_IMAX, "DTS-HD MA + DTS:X IMAX" },
+ { FF_PROFILE_DTS_EXPRESS, "DTS Express" },
{ FF_PROFILE_UNKNOWN },
};

1 change: 1 addition & 0 deletions debian/patches/series
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,4 @@
0074-add-dovi-descriptor-support-in-mpegtsenc.patch
0075-fix-gcc-14-warnings-in-qsv-hwcontext.patch
0076-vt-low-priority-keyframe-decoding.patch
0077-add-detection-of-dtsx.patch

0 comments on commit 42c9269

Please sign in to comment.