Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add detection of DTS:X and DTS:X IMAX #397

Merged
merged 1 commit into from
Jun 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading