Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: media/filters/ffmpeg_demuxer.cc

Issue 53126: Demuxer stream now uses a callback instead of Assignable template. Cleaning ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "base/scoped_ptr.h" 5 #include "base/scoped_ptr.h"
6 #include "base/string_util.h" 6 #include "base/string_util.h"
7 #include "base/time.h" 7 #include "base/time.h"
8 #include "media/base/filter_host.h" 8 #include "media/base/filter_host.h"
9 #include "media/filters/ffmpeg_common.h" 9 #include "media/filters/ffmpeg_common.h"
10 #include "media/filters/ffmpeg_demuxer.h" 10 #include "media/filters/ffmpeg_demuxer.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 // Calculate the time base and duration in microseconds. 82 // Calculate the time base and duration in microseconds.
83 int64 time_base_us = static_cast<int64>(av_q2d(stream->time_base) * 83 int64 time_base_us = static_cast<int64>(av_q2d(stream->time_base) *
84 base::Time::kMicrosecondsPerSecond); 84 base::Time::kMicrosecondsPerSecond);
85 int64 duration_us = static_cast<int64>(time_base_us * stream->duration); 85 int64 duration_us = static_cast<int64>(time_base_us * stream->duration);
86 time_base_ = base::TimeDelta::FromMicroseconds(time_base_us); 86 time_base_ = base::TimeDelta::FromMicroseconds(time_base_us);
87 duration_ = base::TimeDelta::FromMicroseconds(duration_us); 87 duration_ = base::TimeDelta::FromMicroseconds(duration_us);
88 } 88 }
89 89
90 FFmpegDemuxerStream::~FFmpegDemuxerStream() { 90 FFmpegDemuxerStream::~FFmpegDemuxerStream() {
91 // Since |input_queue_| and |output_queue_| use scoped_refptr everything 91 // Since |buffer_queue_| uses scoped_refptr everything will get released.
92 // should get released. 92 while (!read_queue_.empty()) {
93 delete read_queue_.front();
94 read_queue_.pop_front();
95 }
93 } 96 }
94 97
95 // static 98 // static
96 const char* FFmpegDemuxerStream::interface_id() { 99 const char* FFmpegDemuxerStream::interface_id() {
97 return interface_id::kFFmpegDemuxerStream; 100 return interface_id::kFFmpegDemuxerStream;
98 } 101 }
99 102
100 void* FFmpegDemuxerStream::QueryInterface(const char* id) { 103 void* FFmpegDemuxerStream::QueryInterface(const char* id) {
101 DCHECK(id); 104 DCHECK(id);
102 FFmpegDemuxerStream* interface_ptr = NULL; 105 FFmpegDemuxerStream* interface_ptr = NULL;
103 if (0 == strcmp(id, interface_id())) { 106 if (0 == strcmp(id, interface_id())) {
104 interface_ptr = this; 107 interface_ptr = this;
105 } 108 }
106 return interface_ptr; 109 return interface_ptr;
107 } 110 }
108 111
109 bool FFmpegDemuxerStream::HasPendingReads() { 112 bool FFmpegDemuxerStream::HasPendingReads() {
110 AutoLock auto_lock(lock_); 113 AutoLock auto_lock(lock_);
111 return !output_queue_.empty(); 114 return !read_queue_.empty();
112 } 115 }
113 116
114 void FFmpegDemuxerStream::EnqueuePacket(AVPacket* packet) { 117 void FFmpegDemuxerStream::EnqueuePacket(AVPacket* packet) {
115 base::TimeDelta timestamp = time_base_ * packet->pts; 118 base::TimeDelta timestamp = time_base_ * packet->pts;
116 base::TimeDelta duration = time_base_ * packet->duration; 119 base::TimeDelta duration = time_base_ * packet->duration;
117 Buffer* buffer = new AVPacketBuffer(packet, timestamp, duration); 120 Buffer* buffer = new AVPacketBuffer(packet, timestamp, duration);
118 DCHECK(buffer); 121 DCHECK(buffer);
119 { 122 {
120 AutoLock auto_lock(lock_); 123 AutoLock auto_lock(lock_);
121 input_queue_.push_back(buffer); 124 buffer_queue_.push_back(buffer);
122 } 125 }
123 FulfillPendingReads(); 126 FulfillPendingReads();
124 } 127 }
125 128
126 const MediaFormat& FFmpegDemuxerStream::media_format() { 129 const MediaFormat& FFmpegDemuxerStream::media_format() {
127 return media_format_; 130 return media_format_;
128 } 131 }
129 132
130 void FFmpegDemuxerStream::Read(Assignable<Buffer>* buffer) { 133 void FFmpegDemuxerStream::Read(Callback1<Buffer*>::Type* read_callback) {
131 DCHECK(buffer); 134 DCHECK(read_callback);
132 { 135 {
133 AutoLock auto_lock(lock_); 136 AutoLock auto_lock(lock_);
134 output_queue_.push_back(scoped_refptr< Assignable<Buffer> >(buffer)); 137 read_queue_.push_back(read_callback);
135 } 138 }
136 if (FulfillPendingReads()) { 139 if (FulfillPendingReads()) {
137 demuxer_->ScheduleDemux(); 140 demuxer_->ScheduleDemux();
138 } 141 }
139 } 142 }
140 143
141 bool FFmpegDemuxerStream::FulfillPendingReads() { 144 bool FFmpegDemuxerStream::FulfillPendingReads() {
142 bool pending_reads = false; 145 bool pending_reads = false;
143 while (true) { 146 while (true) {
144 scoped_refptr<Buffer> buffer_in; 147 scoped_refptr<Buffer> buffer;
145 scoped_refptr< Assignable<Buffer> > buffer_out; 148 scoped_ptr<Callback1<Buffer*>::Type> read_callback;
146 { 149 {
147 AutoLock auto_lock(lock_); 150 AutoLock auto_lock(lock_);
148 pending_reads = !output_queue_.empty(); 151 pending_reads = !read_queue_.empty();
149 if (input_queue_.empty() || output_queue_.empty()) { 152 if (buffer_queue_.empty() || read_queue_.empty()) {
150 break; 153 break;
151 } 154 }
152 buffer_in = input_queue_.front(); 155 buffer = buffer_queue_.front();
153 buffer_out = output_queue_.front(); 156 read_callback.reset(read_queue_.front());
154 input_queue_.pop_front(); 157 buffer_queue_.pop_front();
155 output_queue_.pop_front(); 158 read_queue_.pop_front();
156 } 159 }
157 buffer_out->SetBuffer(buffer_in); 160 read_callback->Run(buffer);
158 buffer_out->OnAssignment();
159 } 161 }
160 return pending_reads; 162 return pending_reads;
161 } 163 }
162 164
163 165
164 // 166 //
165 // FFmpegDemuxer 167 // FFmpegDemuxer
166 // 168 //
167 FFmpegDemuxer::FFmpegDemuxer() 169 FFmpegDemuxer::FFmpegDemuxer()
168 : demuxing_(false), 170 : demuxing_(false),
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 StreamVector::iterator iter; 286 StreamVector::iterator iter;
285 for (iter = streams_.begin(); iter != streams_.end(); ++iter) { 287 for (iter = streams_.begin(); iter != streams_.end(); ++iter) {
286 if ((*iter)->HasPendingReads()) { 288 if ((*iter)->HasPendingReads()) {
287 return true; 289 return true;
288 } 290 }
289 } 291 }
290 return false; 292 return false;
291 } 293 }
292 294
293 } // namespace media 295 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_demuxer.h ('k') | media/filters/ffmpeg_demuxer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698