-
-
Notifications
You must be signed in to change notification settings - Fork 142
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #397 from jellyfin/dtsx
Add detection of DTS:X and DTS:X IMAX
- Loading branch information
Showing
2 changed files
with
129 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }, | ||
}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters