Index: services/media/framework/conversion_pipeline_builder.cc |
diff --git a/services/media/framework/conversion_pipeline_builder.cc b/services/media/framework/conversion_pipeline_builder.cc |
index dfef3b826ef304082197c0607c37914bb814bfe1..443663792ff52515303c04f4906e3b91bcda15a3 100644 |
--- a/services/media/framework/conversion_pipeline_builder.cc |
+++ b/services/media/framework/conversion_pipeline_builder.cc |
@@ -22,29 +22,29 @@ enum class AddResult { |
// is used to compare type sets to see which represents the best goal for |
// conversion. Higher scores are preferred. A score of zero indicates that |
// in_type is incompatible with out_type_set. |
-int Score(const LpcmStreamType& in_type, |
- const LpcmStreamTypeSet& out_type_set) { |
+int Score(const AudioStreamType& in_type, |
+ const AudioStreamTypeSet& out_type_set) { |
// TODO(dalesat): Plenty of room for more subtlety here. Maybe actually |
// measure conversion costs (cpu, quality, etc) and reflect them here. |
int score = 1; // We can convert anything, so 1 is the minimum score. |
if (in_type.sample_format() == out_type_set.sample_format() || |
- out_type_set.sample_format() == LpcmStreamType::SampleFormat::kAny) { |
+ out_type_set.sample_format() == AudioStreamType::SampleFormat::kAny) { |
// Prefer not to convert sample format. |
score += 10; |
} else { |
// Prefer higher-quality formats. |
switch (out_type_set.sample_format()) { |
- case LpcmStreamType::SampleFormat::kUnsigned8: |
+ case AudioStreamType::SampleFormat::kUnsigned8: |
break; |
- case LpcmStreamType::SampleFormat::kSigned16: |
+ case AudioStreamType::SampleFormat::kSigned16: |
score += 1; |
break; |
- case LpcmStreamType::SampleFormat::kSigned24In32: |
+ case AudioStreamType::SampleFormat::kSigned24In32: |
score += 2; |
break; |
- case LpcmStreamType::SampleFormat::kFloat: |
+ case AudioStreamType::SampleFormat::kFloat: |
score += 3; |
break; |
default: |
@@ -70,31 +70,24 @@ int Score(const LpcmStreamType& in_type, |
return score; |
} |
-// Finds the media type set that best matches in_type. |
+// Finds the stream type set that best matches in_type. |
const std::unique_ptr<StreamTypeSet>* FindBestLpcm( |
- const LpcmStreamType& in_type, |
+ const AudioStreamType& in_type, |
const std::vector<std::unique_ptr<StreamTypeSet>>& out_type_sets) { |
const std::unique_ptr<StreamTypeSet>* best = nullptr; |
int best_score = 0; |
+ |
for (const std::unique_ptr<StreamTypeSet>& out_type_set : out_type_sets) { |
- switch (out_type_set->scheme()) { |
- case StreamType::Scheme::kAnyElementary: |
- case StreamType::Scheme::kAnyAudio: |
- case StreamType::Scheme::kAny: |
- // Wildcard scheme allows any type without conversion. |
- return &out_type_set; |
- case StreamType::Scheme::kLpcm: { |
- int score = Score(in_type, *out_type_set->lpcm()); |
- if (best_score < score) { |
- best_score = score; |
- best = &out_type_set; |
- } |
- break; |
+ if (out_type_set->medium() == StreamType::Medium::kAudio && |
+ out_type_set->IncludesEncoding(StreamType::kAudioEncodingLpcm)) { |
+ int score = Score(in_type, *out_type_set->audio()); |
+ if (best_score < score) { |
+ best_score = score; |
+ best = &out_type_set; |
} |
- default: |
- break; |
} |
} |
+ |
return best; |
} |
@@ -103,7 +96,7 @@ const std::unique_ptr<StreamTypeSet>* FindBestLpcm( |
// (out_type_sets). If the call succeeds, *out_type is set to the new output |
// type. Otherwise, *out_type is set to nullptr. |
AddResult AddTransformsForCompressedAudio( |
- const CompressedAudioStreamType& in_type, |
+ const AudioStreamType& in_type, |
const std::vector<std::unique_ptr<StreamTypeSet>>& out_type_sets, |
Graph* graph, |
OutputRef* output, |
@@ -111,27 +104,17 @@ AddResult AddTransformsForCompressedAudio( |
DCHECK(out_type); |
DCHECK(graph); |
- // See if we have a matching COMPRESSED_AUDIO type. |
+ // See if we have a matching audio type. |
for (const std::unique_ptr<StreamTypeSet>& out_type_set : out_type_sets) { |
- switch (out_type_set->scheme()) { |
- case StreamType::Scheme::kAnyElementary: |
- case StreamType::Scheme::kAnyAudio: |
- case StreamType::Scheme::kAny: |
- // Wildcard scheme allows any type without conversion. |
+ if (out_type_set->medium() == StreamType::Medium::kAudio) { |
+ if (out_type_set->audio()->contains(in_type)) { |
+ // No transform needed. |
*out_type = in_type.Clone(); |
return AddResult::kFinished; |
- case StreamType::Scheme::kCompressedAudio: { |
- if (out_type_set->compressed_audio()->contains(in_type)) { |
- // No transform needed. |
- *out_type = in_type.Clone(); |
- return AddResult::kFinished; |
- } |
- break; |
} |
- default: |
- break; |
+ // TODO(dalesat): Support a different compressed output type by |
+ // transcoding. |
} |
- // TODO(dalesat): Support a different compressed output type by transcoding. |
} |
// Find the best LPCM output type. |
@@ -143,7 +126,8 @@ AddResult AddTransformsForCompressedAudio( |
return AddResult::kFailed; |
} |
- DCHECK_EQ((*best)->scheme(), StreamType::Scheme::kLpcm); |
+ DCHECK_EQ((*best)->medium(), StreamType::Medium::kAudio); |
+ DCHECK((*best)->IncludesEncoding(StreamType::kAudioEncodingLpcm)); |
// Need to decode. Create a decoder and go from there. |
std::shared_ptr<Decoder> decoder; |
@@ -161,11 +145,11 @@ AddResult AddTransformsForCompressedAudio( |
} |
// Attempts to add transforms to the pipeline given an input LPCM stream type |
-// (in_type) and the output lpcm stream type set for the type we need to convert |
-// to (out_type_set). If the call succeeds, *out_type is set to the new output |
-// type. Otherwise, *out_type is set to nullptr. |
-AddResult AddTransformsForLpcm(const LpcmStreamType& in_type, |
- const LpcmStreamTypeSet& out_type_set, |
+// (in_type) and the output lpcm stream type set for the type we need to |
+// convert to (out_type_set). If the call succeeds, *out_type is set to the new |
+// output type. Otherwise, *out_type is set to nullptr. |
+AddResult AddTransformsForLpcm(const AudioStreamType& in_type, |
+ const AudioStreamTypeSet& out_type_set, |
Graph* graph, |
OutputRef* output, |
std::unique_ptr<StreamType>* out_type) { |
@@ -175,7 +159,7 @@ AddResult AddTransformsForLpcm(const LpcmStreamType& in_type, |
// TODO(dalesat): Room for more intelligence here wrt transform ordering and |
// transforms that handle more than one conversion. |
if (in_type.sample_format() != out_type_set.sample_format() && |
- out_type_set.sample_format() != LpcmStreamType::SampleFormat::kAny) { |
+ out_type_set.sample_format() != AudioStreamType::SampleFormat::kAny) { |
*output = |
graph |
->ConnectOutputToPart(*output, graph->Add(LpcmReformatter::Create( |
@@ -198,8 +182,9 @@ AddResult AddTransformsForLpcm(const LpcmStreamType& in_type, |
} |
// Build the resulting media type. |
- *out_type = LpcmStreamType::Create( |
- out_type_set.sample_format() == LpcmStreamType::SampleFormat::kAny |
+ *out_type = AudioStreamType::Create( |
+ StreamType::kAudioEncodingLpcm, nullptr, |
+ out_type_set.sample_format() == AudioStreamType::SampleFormat::kAny |
? in_type.sample_format() |
: out_type_set.sample_format(), |
in_type.channels(), in_type.frames_per_second()); |
@@ -207,12 +192,12 @@ AddResult AddTransformsForLpcm(const LpcmStreamType& in_type, |
return AddResult::kFinished; |
} |
-// Attempts to add transforms to the pipeline given an input media type with |
-// scheme LPCM (in_type) and the set of output types we need to convert to |
-// (out_type_sets). If the call succeeds, *out_type is set to the new output |
-// type. Otherwise, *out_type is set to nullptr. |
+// Attempts to add transforms to the pipeline given an input audio stream type |
+// witn lpcm encoding (in_type) and the set of output types we need to convert |
+// to (out_type_sets). If the call succeeds, *out_type is set to the new |
+// output type. Otherwise, *out_type is set to nullptr. |
AddResult AddTransformsForLpcm( |
- const LpcmStreamType& in_type, |
+ const AudioStreamType& in_type, |
const std::vector<std::unique_ptr<StreamTypeSet>>& out_type_sets, |
Graph* graph, |
OutputRef* output, |
@@ -229,27 +214,16 @@ AddResult AddTransformsForLpcm( |
return AddResult::kFailed; |
} |
- switch ((*best)->scheme()) { |
- case StreamType::Scheme::kAnyElementary: |
- case StreamType::Scheme::kAnyAudio: |
- case StreamType::Scheme::kAny: |
- // Wildcard scheme allows any type without conversion. |
- *out_type = in_type.Clone(); |
- return AddResult::kFinished; |
- case StreamType::Scheme::kLpcm: |
- return AddTransformsForLpcm(in_type, *(*best)->lpcm(), graph, output, |
- out_type); |
- default: |
- NOTREACHED() << "FindBestLpcm produced unexpected type set scheme" |
- << (*best)->scheme(); |
- return AddResult::kFailed; |
- } |
+ DCHECK_EQ((*best)->medium(), StreamType::Medium::kAudio); |
+ |
+ return AddTransformsForLpcm(in_type, *(*best)->audio(), graph, output, |
+ out_type); |
} |
// Attempts to add transforms to the pipeline given an input media type of any |
-// scheme (in_type) and the set of output types we need to convert to |
-// (out_type_sets). If the call succeeds, *out_type is set to the new output |
-// type. Otherwise, *out_type is set to nullptr. |
+// medium and encoding (in_type) and the set of output types we need to |
+// convert to (out_type_sets). If the call succeeds, *out_type is set to the new |
+// output type. Otherwise, *out_type is set to nullptr. |
AddResult AddTransforms( |
const StreamType& in_type, |
const std::vector<std::unique_ptr<StreamTypeSet>>& out_type_sets, |
@@ -259,15 +233,17 @@ AddResult AddTransforms( |
DCHECK(graph); |
DCHECK(out_type); |
- switch (in_type.scheme()) { |
- case StreamType::Scheme::kLpcm: |
- return AddTransformsForLpcm(*in_type.lpcm(), out_type_sets, graph, output, |
- out_type); |
- case StreamType::Scheme::kCompressedAudio: |
- return AddTransformsForCompressedAudio( |
- *in_type.compressed_audio(), out_type_sets, graph, output, out_type); |
+ switch (in_type.medium()) { |
+ case StreamType::Medium::kAudio: |
+ if (in_type.encoding() == StreamType::kAudioEncodingLpcm) { |
+ return AddTransformsForLpcm(*in_type.audio(), out_type_sets, graph, |
+ output, out_type); |
+ } else { |
+ return AddTransformsForCompressedAudio(*in_type.audio(), out_type_sets, |
+ graph, output, out_type); |
+ } |
default: |
- NOTREACHED() << "conversion not supported for scheme" << in_type.scheme(); |
+ NOTREACHED() << "conversion not supported for medium" << in_type.medium(); |
*out_type = nullptr; |
return AddResult::kFailed; |
} |