| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cast/test/fake_media_source.h" | 5 #include "media/cast/test/fake_media_source.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/files/scoped_file.h" | 10 #include "base/files/scoped_file.h" |
| 9 #include "base/logging.h" | 11 #include "base/logging.h" |
| 10 #include "base/rand_util.h" | 12 #include "base/rand_util.h" |
| 11 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 12 #include "media/base/audio_buffer.h" | 14 #include "media/base/audio_buffer.h" |
| 13 #include "media/base/audio_bus.h" | 15 #include "media/base/audio_bus.h" |
| 14 #include "media/base/audio_fifo.h" | 16 #include "media/base/audio_fifo.h" |
| 15 #include "media/base/audio_timestamp_helper.h" | 17 #include "media/base/audio_timestamp_helper.h" |
| 16 #include "media/base/media.h" | 18 #include "media/base/media.h" |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 start_time_ + video_time); | 266 start_time_ + video_time); |
| 265 | 267 |
| 266 // Send just enough audio data to match next video frame's time. | 268 // Send just enough audio data to match next video frame's time. |
| 267 base::TimeDelta audio_time = AudioFrameTime(audio_frame_count_); | 269 base::TimeDelta audio_time = AudioFrameTime(audio_frame_count_); |
| 268 while (audio_time < video_time) { | 270 while (audio_time < video_time) { |
| 269 if (is_transcoding_audio()) { | 271 if (is_transcoding_audio()) { |
| 270 Decode(true); | 272 Decode(true); |
| 271 CHECK(!audio_bus_queue_.empty()) << "No audio decoded."; | 273 CHECK(!audio_bus_queue_.empty()) << "No audio decoded."; |
| 272 scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); | 274 scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); |
| 273 audio_bus_queue_.pop(); | 275 audio_bus_queue_.pop(); |
| 274 audio_frame_input_->InsertAudio( | 276 audio_frame_input_->InsertAudio(std::move(bus), start_time_ + audio_time); |
| 275 bus.Pass(), start_time_ + audio_time); | |
| 276 } else { | 277 } else { |
| 277 audio_frame_input_->InsertAudio( | 278 audio_frame_input_->InsertAudio( |
| 278 audio_bus_factory_->NextAudioBus( | 279 audio_bus_factory_->NextAudioBus( |
| 279 base::TimeDelta::FromMilliseconds(kAudioFrameMs)), | 280 base::TimeDelta::FromMilliseconds(kAudioFrameMs)), |
| 280 start_time_ + audio_time); | 281 start_time_ + audio_time); |
| 281 } | 282 } |
| 282 audio_time = AudioFrameTime(++audio_frame_count_); | 283 audio_time = AudioFrameTime(++audio_frame_count_); |
| 283 } | 284 } |
| 284 | 285 |
| 285 // This is the time since FakeMediaSource was started. | 286 // This is the time since FakeMediaSource was started. |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 Decode(true); | 358 Decode(true); |
| 358 if (audio_bus_queue_.empty()) | 359 if (audio_bus_queue_.empty()) |
| 359 return false; | 360 return false; |
| 360 | 361 |
| 361 base::TimeDelta audio_time = audio_sent_ts_->GetTimestamp(); | 362 base::TimeDelta audio_time = audio_sent_ts_->GetTimestamp(); |
| 362 if (elapsed_time < audio_time) | 363 if (elapsed_time < audio_time) |
| 363 return false; | 364 return false; |
| 364 scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); | 365 scoped_ptr<AudioBus> bus(audio_bus_queue_.front()); |
| 365 audio_bus_queue_.pop(); | 366 audio_bus_queue_.pop(); |
| 366 audio_sent_ts_->AddFrames(bus->frames()); | 367 audio_sent_ts_->AddFrames(bus->frames()); |
| 367 audio_frame_input_->InsertAudio( | 368 audio_frame_input_->InsertAudio(std::move(bus), start_time_ + audio_time); |
| 368 bus.Pass(), start_time_ + audio_time); | |
| 369 | 369 |
| 370 // Make sure queue is not empty. | 370 // Make sure queue is not empty. |
| 371 Decode(true); | 371 Decode(true); |
| 372 return true; | 372 return true; |
| 373 } | 373 } |
| 374 | 374 |
| 375 void FakeMediaSource::SendNextFrame() { | 375 void FakeMediaSource::SendNextFrame() { |
| 376 // Send as much as possible. Audio is sent according to | 376 // Send as much as possible. Audio is sent according to |
| 377 // system time. | 377 // system time. |
| 378 while (SendNextTranscodedAudio(clock_->NowTicks() - start_time_)) { | 378 while (SendNextTranscodedAudio(clock_->NowTicks() - start_time_)) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 void FakeMediaSource::Rewind() { | 412 void FakeMediaSource::Rewind() { |
| 413 CHECK(av_seek_frame(av_format_context_, -1, 0, AVSEEK_FLAG_BACKWARD) >= 0) | 413 CHECK(av_seek_frame(av_format_context_, -1, 0, AVSEEK_FLAG_BACKWARD) >= 0) |
| 414 << "Failed to rewind to the beginning."; | 414 << "Failed to rewind to the beginning."; |
| 415 } | 415 } |
| 416 | 416 |
| 417 ScopedAVPacket FakeMediaSource::DemuxOnePacket(bool* audio) { | 417 ScopedAVPacket FakeMediaSource::DemuxOnePacket(bool* audio) { |
| 418 ScopedAVPacket packet(new AVPacket()); | 418 ScopedAVPacket packet(new AVPacket()); |
| 419 if (av_read_frame(av_format_context_, packet.get()) < 0) { | 419 if (av_read_frame(av_format_context_, packet.get()) < 0) { |
| 420 VLOG(1) << "Failed to read one AVPacket."; | 420 VLOG(1) << "Failed to read one AVPacket."; |
| 421 packet.reset(); | 421 packet.reset(); |
| 422 return packet.Pass(); | 422 return packet; |
| 423 } | 423 } |
| 424 | 424 |
| 425 int stream_index = static_cast<int>(packet->stream_index); | 425 int stream_index = static_cast<int>(packet->stream_index); |
| 426 if (stream_index == audio_stream_index_) { | 426 if (stream_index == audio_stream_index_) { |
| 427 *audio = true; | 427 *audio = true; |
| 428 } else if (stream_index == video_stream_index_) { | 428 } else if (stream_index == video_stream_index_) { |
| 429 *audio = false; | 429 *audio = false; |
| 430 } else { | 430 } else { |
| 431 // Ignore unknown packet. | 431 // Ignore unknown packet. |
| 432 LOG(INFO) << "Unknown packet."; | 432 LOG(INFO) << "Unknown packet."; |
| 433 packet.reset(); | 433 packet.reset(); |
| 434 } | 434 } |
| 435 return packet.Pass(); | 435 return packet; |
| 436 } | 436 } |
| 437 | 437 |
| 438 void FakeMediaSource::DecodeAudio(ScopedAVPacket packet) { | 438 void FakeMediaSource::DecodeAudio(ScopedAVPacket packet) { |
| 439 // Audio. | 439 // Audio. |
| 440 AVFrame* avframe = av_frame_alloc(); | 440 AVFrame* avframe = av_frame_alloc(); |
| 441 | 441 |
| 442 // Make a shallow copy of packet so we can slide packet.data as frames are | 442 // Make a shallow copy of packet so we can slide packet.data as frames are |
| 443 // decoded from the packet; otherwise av_packet_unref() will corrupt memory. | 443 // decoded from the packet; otherwise av_packet_unref() will corrupt memory. |
| 444 AVPacket packet_temp = *packet.get(); | 444 AVPacket packet_temp = *packet.get(); |
| 445 | 445 |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 return; | 563 return; |
| 564 | 564 |
| 565 bool audio_packet = false; | 565 bool audio_packet = false; |
| 566 ScopedAVPacket packet = DemuxOnePacket(&audio_packet); | 566 ScopedAVPacket packet = DemuxOnePacket(&audio_packet); |
| 567 if (!packet) { | 567 if (!packet) { |
| 568 VLOG(1) << "End of stream."; | 568 VLOG(1) << "End of stream."; |
| 569 return; | 569 return; |
| 570 } | 570 } |
| 571 | 571 |
| 572 if (audio_packet) | 572 if (audio_packet) |
| 573 DecodeAudio(packet.Pass()); | 573 DecodeAudio(std::move(packet)); |
| 574 else | 574 else |
| 575 DecodeVideo(packet.Pass()); | 575 DecodeVideo(std::move(packet)); |
| 576 } | 576 } |
| 577 } | 577 } |
| 578 | 578 |
| 579 double FakeMediaSource::ProvideInput(media::AudioBus* output_bus, | 579 double FakeMediaSource::ProvideInput(media::AudioBus* output_bus, |
| 580 base::TimeDelta buffer_delay) { | 580 base::TimeDelta buffer_delay) { |
| 581 if (audio_fifo_->frames() >= output_bus->frames()) { | 581 if (audio_fifo_->frames() >= output_bus->frames()) { |
| 582 audio_fifo_->Consume(output_bus, 0, output_bus->frames()); | 582 audio_fifo_->Consume(output_bus, 0, output_bus->frames()); |
| 583 return 1.0; | 583 return 1.0; |
| 584 } else { | 584 } else { |
| 585 LOG(WARNING) << "Not enough audio data for resampling."; | 585 LOG(WARNING) << "Not enough audio data for resampling."; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 608 AVCodecContext* FakeMediaSource::av_audio_context() { | 608 AVCodecContext* FakeMediaSource::av_audio_context() { |
| 609 return av_audio_stream()->codec; | 609 return av_audio_stream()->codec; |
| 610 } | 610 } |
| 611 | 611 |
| 612 AVCodecContext* FakeMediaSource::av_video_context() { | 612 AVCodecContext* FakeMediaSource::av_video_context() { |
| 613 return av_video_stream()->codec; | 613 return av_video_stream()->codec; |
| 614 } | 614 } |
| 615 | 615 |
| 616 } // namespace cast | 616 } // namespace cast |
| 617 } // namespace media | 617 } // namespace media |
| OLD | NEW |